1. ホーム

[解決済み】継承と合成の違いについて

2022-04-18 10:47:50

質問

コンポジションとインヘリタンスは同じですか? コンポジション・パターンを実装したい場合、Javaではどのようにすればよいのでしょうか?

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

この2つは全く違うものです。継承は "is-a"。 の関係です。コンポジションは "has-a" .

別のクラスのインスタンスを持つことでコンポジションを行います。 C を拡張するのではなく、自分のクラスのフィールドとして使用します。 C . 継承よりも合成の方がずっと良い例として、次のようなものがあります。 java.util.Stack を拡張しています。 java.util.Vector . これは現在では失策とされている。スタック "is-NOT-a"です。 ベクターで、任意に要素を挿入したり削除したりすることは許されないはずです。代わりにコンポジションにすべきだったんだ。

残念ながら、この設計ミスを修正するのは遅すぎました。今、継承階層を変更すると、既存のコードとの互換性が失われるからです。 があった。 Stack は継承ではなく合成を使用しているため、APIに違反することなく、いつでも別のデータ構造を使用するように変更することができます。 .

Josh Blochの本がおすすめ エフェクティブジャバ 第2版

  • 項目16: 継承より合成を優先
  • 項目17: 継承を考慮した設計と文書化、さもなくば禁止

優れたオブジェクト指向の設計とは、既存のクラスを自由に拡張することではありません。最初の直感は、代わりに合成することであるべきです。


こちらもご覧ください。