In meinem Bestreben, besseren und saubereren Code zu schreiben, lerne ich die SOLID-Prinzipien kennen. In dieser Hinsicht erweist sich LSP als wenig schwierig, es richtig zu erfassen.
Mein Zweifel ist, was ist, wenn ich einige zusätzliche Methoden in meinem Subtyp S habe, die nicht im Typ T vorhanden waren, wird dies immer eine Verletzung von LSP sein? Wenn ja, wie mache ich dann extend
meinen Unterricht?
Nehmen wir zum Beispiel an, wir haben einen Bird
Typ. Und seine Untertypen sind Eagle
und Humming Bird
. Jetzt haben beide Untertypen ein gemeinsames Verhalten wie die Bird
. Hat aber Eagle
auch gutes räuberisches Verhalten (das im allgemeinen Bird
Typ nicht vorhanden ist ), das ich nutzen möchte . Daher kann ich das jetzt nicht mehr tun:
Bird bird = new Eagle();
So schenkt Eagle
diese zusätzlichen Verhalten brechen LSP?
Wenn ja, bedeutet das, dass ich meine Klassen nicht erweitern kann, da dies zu einer LSP-Verletzung führen würde?
class Eagle extends Bird {
//we are extending Bird since Eagle has some extra behavior also
}
Das Erweitern von Klassen sollte nach dem Open / Closed-Prinzip erlaubt sein, oder?
Vielen Dank im Voraus für die Antwort! Wie Sie deutlich sehen können, hat mich LSP wie alles verwirrt.
Bearbeiten: Beziehen Sie sich auf diese SO-Antwort. Auch hier verstößt es , wenn Car
es zusätzliches Verhalten hat ChangeGear
, gegen LSP. Wie können wir also eine Klasse erweitern, ohne LSP zu verletzen?
quelle
Antworten:
Sehr einfache Antwort: nein.
Der Punkt zum LSP ist, dass er ersetzt werden
S
sollteT
. Wenn alsoT
einedelete
Funktion implementiert wird,S
sollte sie auch implementiert werden und beim Aufruf ein Löschen durchführen. Es steht jedochS
frei, zusätzliche Funktionen hinzuzufügen, die über die angebotenen FunktionenT
hinausgehen. Verbraucher von aT
, wenn sie gegebenS
werden, sind sich dieser zusätzlichen Funktionalität nicht bewusst, aber es ist zulässig, dass Verbraucher vonS
direkt nutzen können.Beispiele dafür, wie gegen das Prinzip verstoßen werden kann, sind:
Etwas komplexere Antwort: Nein, solange Sie den Status oder ein anderes erwartetes Verhalten des Basistyps nicht beeinflussen.
Zum Beispiel wäre das Folgende eine Verletzung:
Der Typ
Point2D
ist unveränderlich; sein Zustand kann nicht geändert werden. MitMyPoint2D
habe ich dieses Verhalten absichtlich umgangen, um es veränderlich zu machen. Dies unterbricht die Verlaufsbeschränkung vonPoint2D
und ist somit eine Verletzung des LSP.quelle
delete
Funktion hinzugefügt werden könnte , die eine LSP-Verletzung darstellen würde?Natürlich nicht. Wenn das Eagle-Objekt von einem Code verwendet werden kann, der einen Vogel oder eine Unterklasse erwartet und sich so verhält, wie sich ein Vogel verhalten sollte, ist alles in Ordnung.
Natürlich kann das Eagle-Verhalten nur von Code verwendet werden, der weiß, dass es sich um ein solches Objekt handelt. Wir würden erwarten, dass ein Code explizit ein Eagle-Objekt erstellt und es als Eagle-Objekt verwendet, während jeder Code verwendet werden kann, der Bird-Objekte erwartet.
quelle