[解決済み] インターフェースとベースクラス
質問
どのような場合にインターフェースを使用し、どのような場合に基底クラスを使用する必要がありますか?
メソッドの基本実装を実際に定義したくない場合は、常にインターフェイスであるべきでしょうか?
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++は例外です)、複数のインターフェースを実装できるため、厳密には 必要に応じて を基本としています。
関連
-
[解決済み] インターフェースと抽象クラスの違いは何ですか?
-
[解決済み] なぜList<T>を継承しないのですか?
-
[解決済み] インターフェースと抽象クラス(一般的なOO)
-
[解決済み] Pythonでシングルトンを作成する
-
[解決済み] いつ使うか。Java 8+のインターフェイスのデフォルトメソッドと、抽象的なメソッドの比較
-
[解決済み] Javaインターフェースでスタティックメソッドを定義できないのはなぜですか?
-
[解決済み] 抽象クラスの代わりにインターフェイスを使用する場合とその逆は?
-
[解決済み】「インターフェースに合わせたプログラム」とはどういう意味ですか?
-
[解決済み】依存関係逆転の原則とは何ですか、なぜそれが重要なのですか?
-
[解決済み] コンストラクタをprivateにするとどうなるのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Inversion of Controlとは?
-
[解決済み] リスコフ置換原理の例として、どのようなものがありますか?
-
[解決済み] 関数型プログラミングとオブジェクト指向プログラミングの比較【終了しました
-
[解決済み] ミュータブルとイミュータブルのオブジェクト
-
[解決済み] ProxyパターンとDecoratorパターンの違い
-
[解決済み] 実装ではなくインターフェースにプログラムする」とはどういう意味ですか?
-
[解決済み] Delegateとは?[クローズド]。
-
[解決済み] インターフェースと抽象クラス [重複]の比較
-
[解決済み] オブジェクト指向分析・設計によるエレベータのモデル化 [終了しました]
-
[解決済み] Dependency InjectionはEncapsulationを犠牲にしなければならないのか?