DogにAnimalを拡張させてから、3番目のクラスでDogを拡張させることもできますが、3番目のクラスがPoodleでない限り、まだ気付いていない問題が発生する可能性があります。継承であることが適切なのは、関係がモデリング基準である場合のみであり、オブジェクトを拡張して機能を取得することは間違ったアプローチです。継承はIS-Aの原則に従う必要があります。それがあなたのサブクラスですIS-モデリング用語の基本クラス。そのテストに合格しない場合は、合格すべきでないときに継承を使用しています。結局のところ、委任を使用してそれらの機能を取得できます。その意味:
public class SomeClass {
private Dog dog;
public void bark() {
dog.bark(); // this is reusing the functionality without extending
}
}
これで、SomeClassは、Dogを拡張せずに、Dogのメソッドを呼び出したり呼び出すことができます。これの欠点は、Dogへの参照がSomeClassを指すことができないことですが、SomeClassがそうでない場合は、おそらく良い犬です。ただし、DogとSomeClassが入力を共有できるようにする必要がある場合は、DogまたはSomeClassのいずれかを指す参照を持つことができ、両方が共有するインターフェイスを作成できます。
public class SomeClass implements Barkable {
private Dog dog;
@Override
public void bark() {
dog.bark();
}
}
public class Dog implements Barkable {
@Override
public void bark() {
System.out.println( "Bark! Bark!" );
}
}
委任/構成とインターフェースを使用すると、多重継承は必要ありません。適用して習得するのは非常に簡単な手法であり、継承だけに依存するよりもはるかに柔軟なシステムを構築できます。