Javaでは、多型と継承の概念は「溶接」されるために動作しないであろう。一般的に、それはそのようにする必要はありません。
- 多型は、クラスの正確な型
- 継承は、派生クラスのシェアインタフェースとその基底クラスのコードをすることができますを知らなくても、あなたはクラスのメソッドを呼び出すことができます
は継承が多型から分離された言語がある:(あなたが多型の挙動を生じることなくクラスを継承することができますC++では
- すなわちありません
virtual
を持つ基底クラスのmark関数)
- Objective Cでは、無関係のクラスに対してメソッドを実装し、メソッドのシグネチャのみを知っている場所から呼び出すことができます。バックからJavaへ行く
、多型を使用する理由は、そのカウンターパーティの実装の詳細からあなたのコードをデカップリングされています。たとえば、あなたが動物のすべての種類のために働く方法Feed(Animal animal)
を書くことができれば、このメソッドは、Animal
のサブクラスまたは実装を追加するときに適用されます。これは、犬に密接に結合されるFeed(Dog dog)
方法とは対照的である。
限り
Dog d = new Dog();
宣言が行くように、あなたはあなたの方法の残りの部分は犬と特異的に扱うことがわかっている場合はこれを回避するという一般的な理由はありません。しかし、多くの場合、後にはそうではありません。例えば、あなたのクラスや、あなたの方法は、しばしばそのような場合には例
List<Integer> numbers = new ArrayList<Integer>();
ため、正確な実装に鈍感になり、あなたは、new LinkedList<Integer>()
でnew ArrayList<Integer>()
を置き換えることができますがのコードをコンパイルすることを知っています。対照的に、numbers
リストがArrayList<Integer> numbers
と宣言されていた場合、そのような切り替えは確実ではなかった可能性があります。
これは「インターフェイスへのプログラミング」と呼ばれます。それを説明するスタックオーバーフロー上の非常に良いanswerがあります。
質問のタイトル( "多相性対継承")は定義上間違っています:) – Poni
[相続と多型の主な相違点は何ですか?](http://stackoverflow.com/questions/6308178/what-継承と多型の間の主な違いです) – tstew