両方の候補者が適格である場合に有利になります。質問に述べられている問題は、構成オプションしかないため、このアカウントでは失敗します。
「組成も汎化を使用できます」。このステートメントは私たちにとって意味がありますか?そうでない場合、「有利な」ルールを把握する準備がまだできていません。
コンポジションを支持する理由は、コンポジションが一般化よりも拡張/柔軟性の可能性を提供することです。この拡張/柔軟性は、主にランタイム/動的柔軟性を指します(これは、インターフェースと構成の組み合わせで実現されます)。
メリットはすぐにはわかりません。メリットを確認するには、次の予期しない変更リクエストを待つ必要があります。そのため、ほとんどの場合、一般化に固執した人は、構成を採用した人と比較すると失敗します(後述する明らかな1つのケースを除く)。したがって、ルール。学習の観点から、依存性注入を正常に実装できる場合は、どちらをいつ使用するかを知る必要があります。このルールは、どちらを選択すればよいかわからない場合に決定を下すのに役立ちます。繰り返しますが、どちらか一方を優先するために、最初に両方のオプションを確認できます。
概要:構成:小さなものを大きなものに接続するだけで結合が減少し、大きなオブジェクトは小さなオブジェクトをコールバックするだけです。ジェネラライゼーション:メソッドをオーバーライドできることを定義するサードパーティAPIの観点からは、メソッドを呼び出すことができると定義するよりも強い責任があります(一般化には確実に有利です)。また、構成では、大きなクラスの代わりにインターフェースから一般化も使用していることを忘れないでください。しかし、すべてのクレジットは、残念ながら作曲に使用されます。