Komposition ist genau so, wie es sich anhört - Sie erstellen ein Objekt, indem Sie Teile zusammenfügen.
EDITAR der Rest dieser Antwort geht fälschlicherweise von folgender Prämisse aus.
Dies wird durch die Schnittstellen erreicht.
Zum Beispiel mit der Car
Beispiel oben,
Car implements iDrivable, iUsesFuel, iProtectsOccupants
Motorbike implements iDrivable, iUsesFuel, iShortcutThroughTraffic
House implements iProtectsOccupants
Generator implements iUsesFuel
Mit ein paar theoretischen Standardkomponenten können Sie also Ihr Objekt aufbauen. Es ist dann Ihre Aufgabe, auszufüllen, wie ein House
seine Bewohner schützt, und wie ein Car
schützt seine Insassen.
Bei der Vererbung ist es genau andersherum. Sie beginnen mit einem kompletten (oder halbkompletten) Objekt und ersetzen oder überschreiben die verschiedenen Teile, die Sie ändern möchten.
Zum Beispiel, MotorVehicle
kann mit einem Fuelable
Methode und Drive
Methode. Sie können die Kraftstoffmethode so belassen, wie sie ist, weil es dasselbe ist, ein Motorrad und ein Auto zu betanken, aber Sie können die Methode Drive
Methode, weil das Motorrad ganz anders fährt als ein Car
.
Bei der Vererbung sind einige Klassen bereits vollständig implementiert, und andere haben Methoden, die Sie überschreiben müssen. Bei der Komposition wird Ihnen nichts vorgegeben. (aber Sie können die Schnittstellen implementieren, indem Sie Methoden in anderen Klassen aufrufen, wenn Sie zufällig etwas herumliegen haben).
Komposition wird als flexibler angesehen, denn wenn man eine Methode wie iUsesFuel hat, kann man irgendwo anders (in einer anderen Klasse, einem anderen Projekt) eine Methode haben, die sich nur um Objekte kümmert, die betankt werden können, unabhängig davon, ob es sich um ein Auto, ein Boot, einen Ofen, einen Grill usw. handelt. Schnittstellen schreiben vor, dass Klassen, die angeben, dass sie die Schnittstelle implementieren, auch tatsächlich die Methoden haben, um die es in der Schnittstelle geht. Ein Beispiel,
iFuelable Interface:
void AddSomeFuel()
void UseSomeFuel()
int percentageFull()
dann können Sie irgendwo anders eine Methode haben
private void FillHerUp(iFuelable : objectToFill) {
Do while (objectToFill.percentageFull() <= 100) {
objectToFill.AddSomeFuel();
}
Seltsames Beispiel, aber es zeigt, dass es dieser Methode egal ist, was sie auffüllt, denn das Objekt implementiert iUsesFuel
kann sie gefüllt werden. Ende der Geschichte.
Wenn Sie stattdessen Vererbung verwenden würden, bräuchten Sie verschiedene FillHerUp
Methoden zum Umgang mit MotorVehicles
y Barbecues
Es sei denn, man hätte ein ziemlich seltsames Basisobjekt "ObjectThatUsesFuel", von dem man erben könnte.
2 Stimmen
Andere damit zusammenhängende Frage: Gibt es irgendetwas, das durch Komposition nicht erreicht werden kann, was durch Vererbung möglich ist? stackoverflow.com/questions/2238642/
1 Stimmen
Siehe auch ist-ein-gegen-einen-der-besser-ist
2 Stimmen
Dieser Artikel war für mich sehr nützlich und hilfreich: thoughtworks.com/insights/blog/
0 Stimmen
Auschecken themightyprogrammer.dev/article/inheritance-composition