1. ホーム
  2. oop

[解決済み] インターフェースとベースクラス

2022-03-19 05:44:38

質問

どのような場合にインターフェースを使用し、どのような場合に基底クラスを使用する必要がありますか?

メソッドの基本実装を実際に定義したくない場合は、常にインターフェイスであるべきでしょうか?

DogとCatのクラスがあった場合。なぜ、PetBaseの代わりにIPetを実装したいのでしょうか?ISheds や IBarks (IMakesNoise?) はペットごとに配置できるので、そのためのインターフェースを持つことは理解できますが、一般的なペットにはどちらを使用すればよいのかわかりません。

どのように解決するのですか?

犬と猫のクラスを例にして、C#を使って説明しましょう。

犬も猫も動物、特に四足歩行の哺乳類です(動物は一般的すぎますね)。両者のために、抽象クラスMammalがあると仮定しましょう。

public abstract class Mammal

この基本クラスは、おそらく次のようなデフォルトのメソッドを持つことになるでしょう。

  • フィード
  • メイト

いずれも、どちらの種族間でも多かれ少なかれ同じ実装を持つ行動である。これを定義するために、あなたは

public class Dog : Mammal
public class Cat : Mammal

さて、動物園でよく見かける哺乳類が他にもいるとしよう。

public class Giraffe : Mammal
public class Rhinoceros : Mammal
public class Hippopotamus : Mammal

これはまだ有効です。なぜなら、機能の中核には Feed()Mate() はそのままです。

しかし、キリンやサイ、カバはペットにできるような動物ではありません。そこで、インターフェイスがあると便利なんです。

public interface IPettable
{
    IList<Trick> Tricks{get; set;}
    void Bathe();
    void Train(Trick t);
}

上記の契約に対する実装は、猫と犬で同じにはなりません。その実装を抽象クラスに入れて継承させるのは、悪い考えでしょう。

これで、DogとCatの定義は次のようになります。

public class Dog : Mammal, IPettable
public class Cat : Mammal, IPettable

理論的には、より上位のベースクラスからオーバーライドすることができますが、本質的には、インターフェースは、継承の必要なく、必要なものだけをクラスに追加することを可能にします。

その結果、通常は1つの抽象クラスしか継承できませんが(ほとんどの静的型付けOO言語ではそうです...C++は例外です)、複数のインターフェースを実装できるため、厳密には 必要に応じて を基本としています。