Das Liskovsche Substitutionsprinzip besagt, dass eine abgeleitete Klasse anstelle der Basisklasse eingesetzt werden kann, ohne dass dies Auswirkungen auf den Benutzer hat. Wenn die Basisklasse eine abstrakte Klasse ist, was bedeutet, dass kein Benutzer eine Instanz der Basisklasse verwendet, gelten dann die Liskov-Vererbungsbeschränkungen immer noch für die abgeleitete Klasse?
Antworten
Zu viele Anzeigen?Nur weil Sie eine bestimmte Klasse nicht instanziieren können, heißt das nicht, dass Sie sie nicht verwenden können. In diesem Szenario verwendet der aufrufende Code die abstrakte Basisklasse als Definition des Vertrags, unter dem er arbeitet. In diesem Sinne sollte jede Klasse, die von der Basisklasse abgeleitet ist, in Bezug auf die von der Basisklasse definierte Schnittstelle austauschbar sein, so dass Liskov immer noch gilt. In der Tat ist dies einer der Hauptgründe, warum man eine abstrakte Basisklasse für eine Sammlung von Klassen haben möchte, die ein gemeinsames Verhalten haben - so kann man Operationen in Bezug auf die Schnittstelle der Basisklasse definieren und sich nicht darum kümmern, auf welcher abgeleiteten Klasse man tatsächlich operiert.
Abstrakte Klassen stehen überhaupt nicht im Widerspruch zu LSP. Viele Leute betrachten die Verwendung von "new" direkt aus dem Client-Code als einen Verstoß gegen den Geist von LSP. Wenn man ein Objekt sowohl instanziiert als auch verwendet, ist man fest an diese Implementierung gebunden und kann sie nicht "ersetzen".
Ziehen Sie in Erwägung, das Objekt über eine Fabrik zu erstellen oder als Argument zu übergeben oder über Dependency Injection, nachdem es von einer Art Repository erstellt wurde, das sich darauf konzentrieren kann, Entscheidungen darüber zu treffen, welche konkreten Typen unter verschiedenen Umständen benötigt werden.
Sí.
Siehe den Abschnitt "Ein reales Beispiel" (Seite 7-8) in Onkel Bobs Artikel Das Liskovsche Substitutionsprinzip .
Quelle: die Seite Alte Artikel von cleancoder.de