Zusammensetzung ist, wenn eine Klasse einige Funktionen bietet, indem sie eine (möglicherweise interne) Klasse instanziiert, die diese Funktionalität bereits implementiert, anstatt von dieser Klasse zu erben.
Wenn Sie beispielsweise eine Klasse haben, die ein Schiff modelliert, und Ihnen jetzt gesagt wird, dass Ihr Schiff einen Hubschrauberlandeplatz anbieten soll, ist es nicht selbstverständlich, Ihr Schiff stattdessen von einem Hubschrauberlandeplatz abzuleiten (duh!) Ihr Schiff enthält eine Hubschrauberlandeplatzklasse und legt sie auf irgendeine Ship.getHelipad()
Weise frei.
In früheren Jahren (vor etwa einem Jahrzehnt) betrachteten die Menschen die Vererbung als eine schnelle und einfache Möglichkeit, die Funktionalität zu aggregieren. Daher gab es viele Beispiele für die Art "Schiff, das vom Hubschrauberlandeplatz erbt", die natürlich sehr lahm waren.
Das Diktum "Bevorzugung der Komposition gegenüber Vererbung" wurde jedoch sorgfältig formuliert, um deutlich zu machen, dass dies nur ein Vorschlag und keine Regel ist. Der Verfasser des Diktums war vorsichtig genug, um nicht zu sagen: "Du sollst niemals Vererbung verwenden, nur Komposition". Dies macht die Softwareentwickler im Grunde auf die Tatsache aufmerksam, dass die Vererbung überbeansprucht wurde, während in vielen Fällen die Komposition klarere, elegantere und wartbarere Designs hervorbringt als die Vererbung.
Das Diktum "Bevorzugen Sie die Komposition gegenüber der Vererbung" schlägt also im Wesentlichen vor, wann immer Sie mit dem "Erben oder Komponieren" konfrontiert sind. Frage, Sie sollten sich überlegen, was die am besten geeignete Strategie ist und dass die meisten Chancen bestehen, dass sich die am besten geeignete Strategie als Zusammensetzung und nicht als Vererbung herausstellt.
Da dies jedoch keine Regel ist, sollten Sie auch berücksichtigen, dass es viele Fälle gibt, in denen die Vererbung natürlicher ist. Wenn Sie dort Komposition verwenden, wo Sie Vererbung hätten verwenden sollen, werden viele Übel Ihren Code treffen.
Um zum Schiffsbeispiel zurückzukehren: Wenn Ihr Schiff eine Schnittstelle für die Interaktion mit a bieten muss, FloatingMachine
ist es natürlicher, es von einer abstrakten FloatingMachine
Klasse abzuleiten , die möglicherweise wiederum von einer anderen abstrakten Machine
Klasse abgeleitet wird.
Hier ist die Faustregel für die Antwort auf die Frage Zusammensetzung / Vererbung:
Hat meine Klasse eine "Ist eine" Beziehung zu der Schnittstelle, die sie verfügbar machen muss? Wenn ja, verwenden Sie die Vererbung. Wenn nicht, verwenden Sie Komposition.
Ein Schiff ist eine schwimmende Maschine, und eine schwimmende Maschine ist eine Maschine. Vererbung ist also für diese vollkommen in Ordnung. Aber ein Schiff ist natürlich kein Hubschrauberlandeplatz. So kann die Funktionalität des Hubschrauberlandeplatzes besser zusammengestellt werden.