web-dev-qa-db-ja.com

抽象クラス+継承とインターフェイス

プログラマの皆さん、こんにちは。

私はC#に関する本を読んでおり、著者は抽象クラスとインターフェイスを比較しています。彼はあなたが次の「抽象クラス」を持っていると主張している:

abstract class CloneableType
{
public abstract object Clone();
}

次に、これを行うことはできません:

public class MiniVan : Car, CloneableType
{}

これ、わかりました。ただし、多重継承を行うことができないため、次のようにCloneableTypeのインターフェイスを使用する必要があると彼は主張しています。

public interface ICloneable
{
object Clone();
}

私の質問は、これはやや誤解を招きやすいのではありません。メソッドCloneでクラスCarの「上」にある抽象クラスを作成し、Carにそのクラスを継承させ、MinivanがこれらすべてのメソッドCloneAbleクラスでCarを継承するためです。 >車クラス->ミニバンクラス。

どう思いますか?ありがとう。

5

あなたのケースの抽象クラスとインターフェースの違いにより、開発者は、抽象クラス作成「is a」関係とインターフェース作成「can do」関係でデザインのパターンを明確に定義できます。

言い換えると、おもちゃの車があり、ミニバンと「関係」があるようにしても意味がない場合は、インターフェースを使用して、耐水性などのおもちゃの車特有の動作を示すことができます。

したがって、次のように定義できます。

public Interface IToyCarResistance
{
  int ToleranceLevel { get; }
}

public class ToyCar : Car , IToyCarResistance
{
}
8
Turbot

短い回答:作成者は、クラスは1つからのみ継承できること、および1つの基本クラスのみを強調しています。ただし、必要に応じて多くのインターフェースを使用できます。これは、C#、VB.NET言語に当てはまります。

ただし、クラスを継承するクラスのセットがある場合があります。また、変更の継承を構築することもできます。これは慎重に設計する必要があり、避けた方がよいでしょう。

要するに、インターフェースは、一般的な動作(作成、更新、削除などのアクション)をクラスに伝達するのに非常に便利です。

3
Yusubov

著者が強調しようとしている考え方は、インターフェイスではなく抽象クラスを設計すると、そのクラスを後でシステムの他の部分と混合して一致させる能力が制限されるということです。これは、後で複数の抽象クラスを結合できないことと引き換えに実装を共有する機能間のトレードオフです。

3
dasblinkenlight