Gunst entsteht, wenn sich beide Kandidaten qualifizieren. Das in der Frage angegebene Problem schlägt in diesem Konto fehl, da nur eine Kompositionsoption vorhanden ist.
"Komposition könnte auch Verallgemeinerung gebrauchen". Ist diese Aussage für uns sinnvoll? Wenn nicht, sind wir noch nicht bereit, die Gunstregel zu verstehen.
Wir bevorzugen Komposition, weil Komposition mehr Erweiterungs- / Flexibilitätsmöglichkeiten bietet als Generalisierung. Diese Erweiterung / Flexibilität bezieht sich hauptsächlich auf die Laufzeit / dynamische Flexibilität (die durch die Kombination von Schnittstellen und Zusammensetzung erreicht wird).
Der Nutzen ist nicht sofort sichtbar. Um den Nutzen zu sehen, müssen Sie auf die nächste unerwartete Änderungsanforderung warten. In den meisten Fällen scheitern diejenigen, die an der Verallgemeinerung festhalten, im Vergleich zu denen, die sich der Komposition verschrieben haben (mit Ausnahme eines offensichtlichen Falls, der später erwähnt wird). Daher die Regel. Wenn Sie aus Lernsicht eine Abhängigkeitsinjektion erfolgreich implementieren können, sollten Sie wissen, welche Sie wann bevorzugen sollten. Die Regel hilft Ihnen bei der Entscheidung, wenn Sie sich nicht sicher sind, welche Sie wählen sollen. Auch hier sollten Sie in der Lage sein, beide Optionen zu sehen, um eine zu bevorzugen.
Zusammenfassung: Zusammensetzung: Die Kopplung wird reduziert, indem nur einige kleinere Dinge an etwas Größeres angeschlossen werden, und das größere Objekt ruft nur das kleinere Objekt zurück. Generierung: Aus Sicht der API eines Drittanbieters ist die Definition, dass eine Methode überschrieben werden kann, eine stärkere Verpflichtung als die Definition, dass eine Methode aufgerufen werden kann (sicherer Gewinn für die Generalisierung). Und vergessen Sie niemals, dass Sie bei Kompositionen auch Generalisierung verwenden, und zwar über eine Schnittstelle anstelle einer großen Klasse. Aber der ganze Kredit geht leider an die Komposition.