オブジェクト指向設計に関連するコンポジションとは?
2023-09-21 05:26:23
質問
私は、quot;favor composition over inheritance"についてよく聞きます(このサイトでも読みます)。
しかし、コンポジションとは何でしょうか?継承はPerson : Mammal : Animalで理解できるのですが、Compostionの定義がどこにあるのかよくわかりません...。どなたか教えてください。
どのように解決するのですか?
合成とは、単純な型を組み合わせて、より複雑な型を作ることです。あなたの例では、合成は次のようになります。
Animal:
Skin animalSkin
Organs animalOrgans
Mammal::Animal:
Hair/fur mammalFur
warm-blooded-based_cirulation_system heartAndStuff
Person::Mammal:
string firstName
string lastName
もし、完全にコンポジションにしたい場合(そして、すべての継承を取り除く)には、次のようになります。
Animal:
Skin animalSkin
Organs animalOrgans
Mammal:
private Animal _animalRef
Hair/fur mammalFur
warm-blooded-based_cirulation_system heartAndStuff
Person:
private Mammal _mammalRef
string firstName
string lastName
この方法の利点は,型
Mammal
と
Person
は、その前の親のインタフェースに適合する必要はありません。この
は
というのは、スーパークラスの変更がサブクラスに深刻な影響を与えることがあるからです。
彼らはまだこれらのクラスのプライベートなインスタンスを通してこれらのクラスのプロパティと動作にアクセスすることができ、これらの元スーパークラスの動作を公開したい場合は、単にパブリック メソッドでそれらをラップすることができます。
私はここで良い例と良いリンクを見つけました。 http://www.artima.com/designtechniques/compoinh.html
関連
-
[解決済み] MVPとMVC、その違いは何ですか?
-
[解決済み] Inversion of Controlとは?
-
[解決済み] メソッドと関数の違いは何ですか?
-
[解決済み] 抽象メソッドと仮想メソッドの違いは何ですか?
-
[解決済み] インターフェースと抽象クラス(一般的なOO)
-
[解決済み] Abstract FactoryとFactoryのデザインパターンの違いは何ですか?
-
[解決済み] コンストラクタをprivateにするとどうなるのですか?
-
[解決済み] カプセル化と抽象化の違い
-
[解決済み] typescript で基底クラスのコンストラクタでオーバーライドされたメソッドを呼び出す
-
[解決済み] なぜプロトコルの関連型はSwiftの汎用型構文を使用しないのですか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] リスコフ置換原理の例として、どのようなものがありますか?
-
[解決済み] 抽象クラスの代わりにインターフェイスを使用する場合とその逆は?
-
[解決済み] プライベートとプロテクト-ビジビリティ・グッド・プラクティスの懸念点【終了しました
-
[解決済み] オブジェクト指向分析・設計によるエレベータのモデル化 [終了しました]
-
[解決済み] カプセル化と抽象化の違い
-
[解決済み] WRAPPERはプログラミングのどこで、どのように使われているか、何をするのに役立つか?
-
[解決済み] protected なメンバ変数を使うべきですか?
-
[解決済み] adapter-Any real example of Adapter Pattern [クローズド].
-
[解決済み] typescript で基底クラスのコンストラクタでオーバーライドされたメソッドを呼び出す
-
[解決済み] R:スロットとは何ですか?