13 Stimmen

Gilt das Liskov-Substitutionsprinzip auch für Untertypen, die von einer abstrakten Klasse geerbt wurden?

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?

7voto

tvanfosson Punkte 506878

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.

1voto

Jeff Sternal Punkte 46528

Ja, denn ein Anrufer kann dies immer tun:

BaseAbstractClass instance = new DerivedClass();

0voto

David Gladfelter Punkte 4107

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.

0voto

Jerry Coffin Punkte 452852

Kurz gesagt, ja. Die LSP gilt im Wesentlichen für alle öffentliche Vererbung. Die Tatsache, dass eine Basisklasse abstrakt ist, ändert daran nichts. Die Basisklasse definiert eine Schnittstelle, und alle legitimen Ableitungen müssen alle Anforderungen dieser Schnittstelle erfüllen.

0voto

lance Punkte 15780

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

CodeJaeger.com

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.

Powered by:

X