2010-04-06 3 views
5

Was sind die Vor- und Nachteile von Option 2 über 1 in diesem Beispiel?Welche Vorteile bietet die Verwendung der Komposition gegenüber der Vererbung, wenn wir einer Liste <> ein Verhalten hinzufügen müssen?

Option 1 (Vererbung):

public class SalesList : List<Sales> 
{ 
    //methods that add extra behavior List<Sales> 
} 

Option 2 (Zusammensetzung):

public class SalesList 
{ 
    private List<Sales> _list; 
    //methods that add extra behavior to List<Sales> 
} 
+0

möglich duplikat von http://stackoverflow.com/questions/1598722/should-i-use-inheritance-or-composition – Lucero

Antwort

1

Option 1
- Vorteile - alle Vorteile der Vererbung & Nachnutzung
- Nachteile - der Code nun an die Verbraucher signalisiert, dass es der Firma List dervied wird. Wenn dies zu einem späteren Zeitpunkt geändert werden muss, sind alle betroffenen Verbraucher betroffen.

Option 2
- Vorteile - das Implementierungsdetail über die Speicherung der Verkaufsdaten wird vom Verbraucher abstrahiert. Wenn also die Implementierung geändert werden muss (z. B. ein Wörterbuch), ist der Konsument der Klasse von diesen Änderungen immun.
- Nachteile - Die SalesList-Klasse muss jetzt zusätzliche Methoden bereitstellen, um das innere _list -Objekt abzurufen und/oder festzulegen. Dies ist zusätzlicher Code, der gepflegt werden muss. Wenn sich die innere Implementierung ändert, müssen Sie außerdem darauf achten, das vorherige Verhalten noch zu unterstützen ...

Nur ein paar Gedanken, die in den Sinn kommen.

HTH.

2

Der Vorteil der Option 2 Agilität. Mit der Komposition können Sie auswählen, welche Teile der Listenoberfläche Sie darstellen möchten.

Stellen Sie sich vor, dass Sie später entscheiden, nicht mehr von einer anderen Klasse zu erweitern. Einige der Benutzer Ihrer Bibliothek haben inzwischen die von List bereitgestellten Methoden verwendet. Daher müssen Sie alle Listenmethoden selbst implementieren: add/addAll/contains/retainAll. Das sind eine ganze Reihe von Methoden, die Sie für eine einfache Verkaufsliste implementieren können.

Grundsätzlich kommt es darauf an "wenn im Zweifel, lass es raus", worüber Joshua Bloch in Bumper-Sticker API Design spricht. Jede Facette einer API sollte so klein wie möglich sein, aber nicht kleiner. Sie können später immer Dinge hinzufügen, aber Sie können sie nicht entfernen.

2

Der Hauptnachteil von Composition besteht darin, dass Sie alle öffentlichen Methoden der privaten Liste umbrechen (duplizieren) müssen, wenn Sie die gleiche Schnittstelle präsentieren müssen. In Vererbung stehen Ihnen alle bereits zur Verfügung, können jedoch nicht überschreiben Sie alle, die nicht überschrieben wurden (in C# bedeutet dies, dass die Methode als 'virtual' markiert werden soll, in Java kann sie nicht als 'final' markiert werden).

In C# 3 und höher können Sie Extension-Methoden verwenden, die den Anschein von Vererbung geben, ohne den Hierarchiebaum wirklich in Unordnung zu bringen.

+0

Ein größerer Nachteil ist, dass man nicht in der Lage sein wird, eine 'SalesList' zu übergeben jede Methode, die geschrieben wird, um eine 'Liste ' oder generische 'Liste ' zu erwarten. Das Umschreiben aller "Listen" -Methoden kann ärgerlich, aber kaum unmöglich sein. Wenn eine Methode, für die der Code nicht verfügbar ist, eine "List " erwartet, kann die Verwendung dieser Methode schwierig oder unmöglich sein. Einen Verweis auf die interne Liste zu verlieren scheint dieses Problem zu lösen, schafft aber viel mehr eigene. Da so viele Methoden von 'List' nicht virtuell sind, kann eine abgeleitete Klasse ihr Verhalten nicht viel ändern; man kann feststecken, egal was man tut. – supercat

0

In Komposition können Sie die Super-Klassenimplementierung dynamisch zur Laufzeit ändern. Mithilfe der Vererbung können Sie die Implementierung der Superklasse zur Laufzeit jedoch nicht ändern.

In der Zusammensetzung hängt es davon ab, welche Art von Objekt Sie an den Setter übergeben und es wird sich darauf basierend verhalten.Es wird mehr Flexibilität bei der Umsetzung

2

Vererbung ermöglicht es uns, eine Hierarchie von Klassen zu bilden, so dass Eltern a * Super * ist gesetzt und alle seine Kinder sind * Unter * Satz, der Verallgemeinerung erlaubt, Spezialisierung und anwenden substitution principle

Verwandte Themen