Zusammensetzung bezieht sich auf das Kombinieren einfacher Typen zu komplexeren. In Ihrem Beispiel könnte die Komposition sein:
Animal:
Skin animalSkin
Organs animalOrgans
Mammal::Animal:
Hair/fur mammalFur
warm-blooded-based_cirulation_system heartAndStuff
Person::Mammal:
string firstName
string lastName
Wenn Sie vollständig komponieren möchten (und alle Vererbungen loswerden möchten), würde dies folgendermaßen aussehen:
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
Der Vorteil dieses Ansatzes besteht darin, dass die Typen Mammal
und Person
nicht mit der Schnittstelle ihres vorherigen übergeordneten Elements übereinstimmen müssen. Dies könnte eine gute Sache sein , weil manchmal eine Änderung der übergeordneten Klasse schwerwiegende Auswirkungen auf die Unterklassen haben kann. Sie können weiterhin über ihre privaten Instanzen dieser Klassen auf die Eigenschaften und Verhaltensweisen dieser Klassen zugreifen. Wenn sie diese Verhaltensweisen früherer Oberklassen verfügbar machen möchten, können sie sie einfach in eine öffentliche Methode einschließen.
Ich habe hier einen guten Link mit guten Beispielen gefunden: http://www.artima.com/designtechniques/compoinh.html
Class A
innenClass B
(statt SubklassenClass B
vonClass A
).“ ?w69rdy
es später beantwortet. JA, das kann ich sagen.Zusammensetzung ist einfach die Teile, die das Ganze ausmachen. Ein Auto hat Räder, einen Motor und Sitze. Vererbung ist eine "ist eine" Beziehung. Zusammensetzung ist eine "hat eine" Beziehung.
quelle
Es gibt drei Möglichkeiten, einer Klasse Verhalten zu verleihen. Sie können dieses Verhalten in die Klasse schreiben. Sie können von einer Klasse erben, die das gewünschte Verhalten aufweist. oder Sie können eine Klasse mit dem gewünschten Verhalten als Feld oder Elementvariable in Ihre Klasse integrieren. Die letzten beiden stellen Formen der Wiederverwendung von Code dar, und die letzte - Zusammensetzung - wird im Allgemeinen bevorzugt. Es gibt Ihrer Klasse nicht das gewünschte Verhalten - Sie müssen die Methode immer noch auf dem Feld aufrufen -, aber es schränkt Ihr Klassendesign weniger ein und führt dazu, dass Code einfacher zu testen und zu debuggen ist. Vererbung hat ihren Platz, aber Zusammensetzung sollte bevorzugt werden.
quelle
Zusammensetzung - Die Funktionalität eines Objekts besteht aus einem Aggregat verschiedener Klassen. In der Praxis bedeutet dies, einen Zeiger auf eine andere Klasse zu halten, auf die die Arbeit verschoben wird.
Vererbung - Die Funktionalität eines Objekts besteht aus seiner eigenen Funktionalität und der Funktionalität seiner übergeordneten Klassen.
Schauen Sie sich das Kreisellipsenproblem an , um herauszufinden, warum Komposition gegenüber Vererbung bevorzugt wird .
quelle
Ein Beispiel für Komposition ist, wenn Sie eine Instanz einer Klasse in einer anderen Klasse haben, anstatt von dieser zu erben
Diese Seite enthält einen guten Artikel, in dem erklärt wird, warum die Leute "Komposition gegenüber Vererbung bevorzugen", und einige Beispiele dafür, warum.
quelle
Komposition
bedeutet einfach, Instanzvariablen zu verwenden, die auf andere Objekte verweisen.
Betrachten Sie dieses sehr einfache Beispiel, um zu veranschaulichen, wie sich die Vererbung im Vergleich zur Komposition in der Abteilung für die Wiederverwendung von Code verhält:
1- Code über Vererbung
Wenn Sie das ausführen
Example1 application
, wird "Peeling ist ansprechend" ausgedruckt, da Apple die Implementierung von Fruit erbt (wiederverwendet)peel()
. Wenn Sie jedoch zu einem späteren Zeitpunkt den Rückgabewert vonpeel()
in Peel ändern möchten , wird der Code für gebrochenExample1
. Ihre Änderung an Fruit bricht den Code von Example1, obwohl Example1 Apple direkt verwendet und Fruit niemals explizit erwähnt. Weitere Informationen finden Sie unter So würde das aussehen:2- Code über Komposition Die Komposition bietet eine alternative Möglichkeit
Apple
, dieFruit's
Implementierung von wiederzuverwendenpeel()
. Anstatt zu erweiternFruit
,Apple
kann ein Verweis auf eineFruit
Instanz gespeichert und eine eigenepeel()
Methode definiert werden, die einfachpeel()
die Frucht aufruft . Hier ist der Code:für weitere Informationen ref
quelle