Warum Komposition der Vererbung vorziehen? Welche Kompromisse gibt es für jeden Ansatz? Wann sollten Sie Vererbung der Komposition vorziehen?
Sie sagten Vererbung und Vererbung. Meinen Sie nicht Vererbung und Zusammensetzung?
Warum Komposition der Vererbung vorziehen? Welche Kompromisse gibt es für jeden Ansatz? Wann sollten Sie Vererbung der Komposition vorziehen?
Abgesehen von den is a/has a-Überlegungen muss man auch die "Tiefe" der Vererbung berücksichtigen, die das Objekt durchlaufen muss. Alles, was mehr als fünf oder sechs Vererbungsebenen tief ist, kann zu unerwarteten Casting- und Boxing/Unboxing-Problemen führen, und in diesen Fällen kann es sinnvoll sein, das Objekt stattdessen zu komponieren.
Ein einfacher Weg, dies zu verstehen, wäre, dass Vererbung verwendet werden sollte, wenn Sie ein Objekt Ihrer Klasse benötigen, das dieselbe Schnittstelle als ihre Elternklasse, so dass sie als Objekt der Elternklasse behandelt werden kann (Upcasting). Außerdem würden Funktionsaufrufe auf ein Objekt einer abgeleiteten Klasse überall im Code gleich bleiben, aber die spezifische aufzurufende Methode würde zur Laufzeit bestimmt (d.h. die Low-Level Umsetzung abweicht, ist die hochrangige Schnittstelle bleibt gleich).
Komposition sollte verwendet werden, wenn die neue Klasse nicht dieselbe Schnittstelle haben muss, d. h. wenn Sie bestimmte Aspekte der Implementierung der Klasse verbergen wollen, die der Benutzer dieser Klasse nicht kennen muss. Komposition ist also eher eine Unterstützung für Verkapselung (d.h. Verbergen der Implementierung), während die Vererbung dazu gedacht ist, die Abstraktion (d. h. eine vereinfachte Darstellung von etwas, in diesem Fall der dieselbe Schnittstelle für eine Reihe von Typen mit unterschiedlichen Interna).
+1 für die Erwähnung der Schnittstelle. Ich verwende diesen Ansatz häufig, um bestehende Klassen zu verbergen und meine neue Klasse durch Mocking Out des für die Komposition verwendeten Objekts richtig unit-testbar zu machen. Dies erfordert, dass der Eigentümer des neuen Objekts ihm stattdessen die Kandidaten-Elternklasse übergibt.
Auch wenn die Komposition bevorzugt wird, möchte ich folgende Vorteile hervorheben Vererbung und Nachteile von Zusammensetzung .
Vorteile der Vererbung:
Sie schafft eine logische " IS A" Beziehung. Wenn Auto y Lkw sind zwei Arten von Fahrzeug ( Basisklasse), Unterklasse IS A Basisklasse.
d.h.
Auto ist ein Fahrzeug
Lkw ist ein Fahrzeug
Mit Vererbung können Sie eine Fähigkeit definieren/verändern/erweitern
Nachteile der Komposition:
z.B. Wenn Auto enthält Fahrzeug und wenn Sie den Preis der Auto die definiert wurde in Fahrzeug wird Ihr Code folgendermaßen aussehen
class Vehicle{
protected double getPrice(){
// return price
}
}
class Car{
Vehicle vehicle;
protected double getPrice(){
return vehicle.getPrice();
}
}
Sie können sich die Frage von OP noch einmal ansehen. Ich habe angesprochen: Welche Kompromisse gibt es für jeden Ansatz?
Wie Sie bereits erwähnt haben, sprechen Sie nur über die "Vorteile der Vererbung und die Nachteile der Zusammensetzung", nicht aber über die Kompromisse für JEDEN Ansatz oder die Fälle, in denen Sie einen Ansatz dem anderen vorziehen sollten
Die Subtypisierung ist angemessen und leistungsfähiger, wenn die Invarianten können aufgezählt werden oder die Funktionskomposition für die Erweiterbarkeit verwenden.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.
6 Stimmen
Siehe auch welches Klassendesign besser ist
6 Stimmen
In einem Satz Vererbung ist öffentlich, wenn Sie eine öffentliche Methode haben und Sie ändern es ändert die veröffentlichte api. wenn Sie Zusammensetzung haben und das Objekt komponiert hat sich geändert, müssen Sie nicht Ihre veröffentlichte api ändern.