- ベストアンサー
継承とメンバ変数にオブジェクトを持つ事の違いは?
現在javaの勉強をしています。 public class ClassX { private ClassY animal = new ClassY(); とするのと public class ClassX extends ClassY { とするのとでは前者の方が 複数のClassYを持てたり、状況によって持たなかったりできるので 便利だと思うのですが、後者を使った方がいい場合はあるのでしょうか? よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
前者はコンポジション、後者は継承と言い、両方ともポピュラーな オブジェクトの拡張方法です。 コンポジションは様々な部品を組み合わせてクラスを作成するときに 使います。 継承は、コンポジションと同じ使い方が全く出来ないわけではありませんが、 同一視できるようなクラス群を作成するときに使うのが普通です。 継承の具体的な用途は、OCP(Open Close Principle)を検索してみてください。 OCPはオブジェクト指向でソフトウェアを組み立ててゆく時の重要な設計指針です。
その他の回答 (1)
- salsberry
- ベストアンサー率69% (495/711)
後者ではClassY型の変数にClassXのインスタンスを代入できるが、前者ではそれができない。 後者の場合に、ClassYでm()というインスタンスメソッドを定義していてClassXでそれをオーバーライドしているとする。さらに、void p(ClassY obj) { obj.m(); } というメソッドがあったとしよう。 ここでp(new ClassY())を実行すればClassYで定義されたメソッドm()が実行されるし、p(new ClassX())を実行すればClassXでオーバーライドしたメソッドm()が実行される。 これが継承をベースにしたオブジェクト指向プログラミングの醍醐味。ただし、これがどう嬉しいのかはもっと大きなプログラムを作ってそれを保守・拡張してみないとなかなか実感できないかもしれない。 ちなみに、前者をhas-a関係、後者をis-a関係と呼ぶ。両者をどう使い分けるかはこのキーワードで検索すべし。
お礼
ありがとうございます。 よくわかりました。