[解決済み】継承と合成の違いについて
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: 継承を考慮した設計と文書化、さもなくば禁止
優れたオブジェクト指向の設計とは、既存のクラスを自由に拡張することではありません。最初の直感は、代わりに合成することであるべきです。
こちらもご覧ください。
関連
-
[解決済み] 未処理の例外タイプIOException」が表示されるのですが?
-
[解決済み] java.lang.ClassNotFoundException: クラス com.ibm.db2.jcc.DB2Driver が Worklight プラットフォームまたはプロジェクトに見つかりませんでした。
-
[解決済み] raw 型のメンバへのアンチェックの呼び出し
-
[解決済み] この2回(1927年)を引き算すると、なぜおかしな結果になるのでしょうか?
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] staticmethodとclassmethodの違いについて
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Javaにおけるpublic、protected、package-private、privateの違いは何ですか?
-
[解決済み] JavaでStringをintに変換するにはどうしたらいいですか?
-
[解決済み] 私的相続、公的相続、保護相続の違いについて
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] tempとは何ですか、またjavaにおけるtempの用途は何ですか?
-
[解決済み] HashMapのtoString関数はなぜ異なる順序で自分自身を印刷するのですか?
-
[解決済み] コレクションへの共有参照が見つかりました org.hibernate.HibernateException
-
[解決済み] 警告: コンテキスト初期化中に例外が発生 - 更新の試みはキャンセルされました。
-
[解決済み] プロトコルハンドラの初期化に失敗しました。
-
[解決済み] JOGLまたはLWJGLの既成のプロジェクト
-
[解決済み] mavenのコンパイルに失敗するのはなぜですか?
-
[解決済み] 1行目2列目でBEGIN_ARRAYを期待したが、BEGIN_OBJECTだった。
-
[解決済み] javaでAnnotation Inheritanceのようなものはあるのでしょうか?
-
[解決済み] IntegerからBigIntegerへの変換