Warum ist die Vererbung stark gekoppelt, während die Komposition in Java lose gekoppelt ist? [Duplikat]

8

Ich habe dieses favor composition over inheritance immer wieder in Entwurfsmustern gehört. Einige der dafür angeführten Gründe sind

%Vor%

Es wäre toll für Anfänger, wenn Sie mir anhand von Illustrationen folgen, wie sich Erbschaft und Zusammensetzung in Bezug auf die oben genannten Punkte unterscheiden. Ich habe verschiedene SO-Links gelesen, die über sie sprechen, aber durch Beispiele zu diesen Schlüsselpunkten zu gehen wäre großartig für Java-Anfänger.

Ich denke, es ist sehr wichtig, den Unterschied klar zu verstehen, als nur die Punkte zu merken.

    
brain storm 02.10.2013, 21:16
quelle

2 Antworten

5

Schöne Frage und groß für einen Anfänger, ich denke, ich sollte zuerst Vererbung und Zusammensetzung erinnern, und dann gehen zu erklären, was genau Favor Composition over Inheritance bedeutet.

Prosa und Nachteile der Vererbung :

Vorteile:

  • Einer der Hauptvorteile von dynamischer Bindung und Polymorphismus ist der Sie können dabei helfen, Code einfacher zu ändern
  • Neue Implementierung ist einfach, da das meiste davon vererbt wird Ändern oder erweitern Sie die Implementierung, die wiederverwendet wird.

Nachteile:

  • Bricht die Kapselung ab, da sie eine Unterklasse für die Implementierung verfügbar macht Details seiner Superklasse
  • White-box Wiederverwendung, da interne Details von Super-Klassen oft sind sichtbar für Untermietverhältnisse.
  • Unterklassen müssen möglicherweise geändert werden, wenn die Implementierung des Superklassenänderungen Von Superklassen geerbte Implementierungen können zur Laufzeit nicht geändert werden.

Über die Frage:

  

Die Vererbung ist dort stark gekoppelt, wo die Komposition lose gekoppelt ist

Die Vererbung führt zu einer engen Kopplung, eine einfache Änderung der Basisklasse kann viele untergeordnete Klassen durchbrechen.

Aber wann müssen wir Vererbung oder Zusammensetzung verwenden?
Verwenden Sie die Vererbung nur, wenn alle folgenden Kriterien erfüllt sind (Coad-Regel):

  1. Eine Unterklasse drückt is a special kind of und nicht is a role played by a aus.
  2. Eine Instanz einer Unterklasse muss niemals ein Objekt einer anderen Klasse werden
  3. Eine Unterklasse erweitert die Verantwortlichkeiten von seine Superklasse
  4. Eine Unterklasse erweitert nicht die Fähigkeiten von a Dienstprogrammklasse
  5. Für eine Klasse in der eigentlichen Problemdomäne ist die Unterklasse spezialisiert         eine Rolle, Transaktion oder ein Gerät
  

Vererbung ist die Kompilierzeit, die bestimmt wird, wo die Zusammensetzung Laufzeit ist

Beim Kompilieren werden Ihre Basisklassencodes zu jeder untergeordneten Klasse hinzugefügt.

  

Die Vererbung bricht die Einkapselung ab, wo die Zusammensetzung nicht

ist

Ja. Siehe den Nachteil der Vererbung.

Die untere Zeile ist :

Stellen Sie sicher, dass Vererbung die Is-a-Beziehung modelliert Meine Hauptleitphilosophie ist, dass Vererbung nur verwendet werden sollte, wenn eine Unterklasse eine Oberklasse ist. Im obigen Beispiel ist ein Apple wahrscheinlich eine Frucht, also würde ich geneigt sein, Vererbung zu verwenden. Eine wichtige Frage, die Sie sich stellen sollten, wenn Sie denken, dass Sie eine Beziehung "Ist-Eine" haben, ist, ob diese Beziehung während der gesamten Lebensdauer der Anwendung und mit etwas Glück der Lebenszyklus des Codes konstant bleibt. Zum Beispiel könnten Sie denken, dass ein Mitarbeiter eine Person ist, wenn Mitarbeiter tatsächlich eine Rolle darstellt, die eine Person zu einem bestimmten Zeitpunkt spielt. Was ist, wenn die Person arbeitslos wird? Was ist, wenn die Person sowohl ein Angestellter als auch ein Vorgesetzter ist? Solch unbeständiges ist - Beziehungen sollten in der Regel mit Komposition modelliert werden.

Verwenden Sie keine Vererbung, nur um die Wiederverwendung von Code zu erhalten   Wenn Sie nur Code wiederverwenden möchten und keine Beziehung in Sicht ist, verwenden Sie Komposition.

Verwenden Sie Vererbung nicht nur, um auf Polymorphismus zu kommen   Wenn alles, was Sie wirklich wollen, ist Polymorphismus, aber es gibt keine natürliche ist-eine Beziehung, verwenden Sie Komposition mit Schnittstellen. Favor Zusammensetzung über Vererbung:)

Ich nahm es direkt von der javaworld .

    
jdev 02.10.2013 23:20
quelle
1

Die Vererbung wird im Code ausgedrückt, indem extends für konkrete Klassen verwendet wird. Sobald Sie es geschrieben haben, können Sie es nicht ändern, ohne die Klassen neu zu schreiben. Ich kann nur ändern, indem ich Code ändere.

%Vor%

Ich kann nur ändern, was Bar tut, indem ich eine oder beide Klassen modifiziere.

Die Komposition ist normalerweise schnittstellenbasiert, was bedeutet, dass Sie angeben, was getan wird und nicht wie. Sie können die Vorgehensweise ändern, ohne Clients zu beeinflussen, indem Sie einfach die Implementierung der Schnittstelle ändern.

%Vor%

Ich kann das Verhalten von Bar in diesem Fall ändern, indem ich einfach eine andere Implementierung der Foo -Schnittstelle übergebe.

Es ist eines von Bob Martins SOLID Prinzipien: Das offene / geschlossene Prinzip .

    
duffymo 02.10.2013 21:18
quelle