Wie verstößt die Stärkung von Vorbedingungen und die Schwächung von Nachbedingungen gegen das Liskov-Substitutionsprinzip?

19

Ich habe gelesen, dass das Substitutionsprinzip von Liskov verletzt wird, wenn:

  1. Voraussetzungen sind gestärkt, oder

  2. Nachbedingungen werden geschwächt

Aber ich verstehe noch nicht ganz, wie diese beiden Punkte das Liskov-Substitutionsprinzip verletzen würden. Kann jemand bitte mit einem Beispiel erklären. Wie kann eine der oben genannten Bedingungen dazu führen, dass ein Unterklassenobjekt nicht durch ein Oberklassenobjekt ersetzt werden kann?

Aussenseiter
quelle

Antworten:

29
  1. Angenommen, Ihre Basisklasse arbeitet mit einem Member int. Nun erfordert Ihr Subtyp, dass int positiv ist. Dies ist eine verstärkte Voraussetzung, und jetzt ist jeder Code, der zuvor mit negativen Ints einwandfrei funktioniert hat, kaputt.

  2. Nehmen Sie ebenfalls dasselbe Szenario an, aber die Basisklasse, die verwendet wird, um zu gewährleisten, dass das Mitglied nach dem Aufrufen positiv ist. Dann ändert der Subtyp das Verhalten, um negative Ints zuzulassen. Code, der mit dem Objekt arbeitet (und davon ausgeht, dass die Nachbedingung ein positives int ist), ist jetzt fehlerhaft, da die Nachbedingung nicht eingehalten wird.

Dies sind natürlich triviale Beispiele, aber das Konzept gilt. Dinge wie das Öffnen einer Datei- / Datenbankverbindung sind ein Beispiel für eine erleichterte Nachbedingung, die zu Problemen führt.

Telastyn
quelle
1

Bildbeschreibung hier eingeben

Invariant - Vorlage von SelfDrivingVehicle, die in allen Untertypen unverändert bleibt, dh in der Reihenfolge, in der das überschriebene Verhalten ausgeführt wird, um das Ziel zu erreichen.

Nehmen wir hier eine weitere Methode an

           -List<SelfDrivingVehicle> vehicles 
           +Add(SelfDrivingVehicle vehicle)
            vehicles.add(vehicle)

Voraussetzung - SelfDriveVehicle, der Basistyp, enthält keine Fahrzeuge (hier ist der Kontext Hinzufügen) und seine abgeschwächte Voraussetzung, die von keinem seiner Untertypen geändert werden kann, indem die Eigenschaftsfahrzeuge geändert und explizit gestärkt werden. Jeder der Untertypen kann nur Add aufrufen.

Nachbedingung - Nach dem Aufrufen von Hinzufügen befindet sich der Basistyp in der verstärkten Nachbedingung, die durch Ändern des Fahrzeugwerts nicht durch Untertypen geschwächt werden kann.

Der Status des Basistyps wird auf den ursprünglichen Status zurückgesetzt, sobald das Verhalten "Hinzufügen" aufgerufen wird.

Vishal Patwardhan
quelle
-1

Dieses Beispiel ist ziemlich zu Tode geprügelt, aber ziehen Sie die Möglichkeit Quadrat / Rechteck oder Kreis / Ellipse in Betracht. Angenommen, Sie haben eine Basisklasse Rectangle, die ein Objekt mit einer Länge und Breite definiert. Wenn Sie eine Square-Klasse haben, die die Rectangle-Klasse erbt, würde sie eine Regel in ihrem Setter / Getter haben, die erfordert, dass jede Änderung der Länge oder Breite ihr Gegenstück ändert. Diese Maßanforderungen verstärken die Voraussetzungen, da ein Rechteck, das ein Quadrat ersetzt, diese Maßanforderungen nicht erfüllen würde. Angenommen, Sie kehren die Vererbung um, sodass ein Rechteck ein Quadrat erbt. Dadurch würden Sie die Post-Bedingungen schwächen, indem Sie die Dimensionsanforderungen lockern, damit sich das Rechteck unabhängig verhält.

Wenn Sie jedoch die Fähigkeit zur Dimensionsänderung entfernen, gilt das Substitutionsprinzip, da, wenn weder ein Rechteck noch ein Quadrat die Dimensionen ändern dürfen, diese unabhängig von der Vererbung gleiche Vor- und Nachbedingungen haben. Beide haben eine Länge, beide eine Breite und keiner kann diese Werte ändern.

Ref: Wikipedia - http://en.wikipedia.org/wiki/Liskov_substitution_principle

Joel Etherton
quelle
1
Leider hat dieses Beispiel nichts mit formaler Verifikation zu tun. Es gibt keine Verträge.
Frank Hileman