Ich glaube, die Argumentation so etwas wie dieses:
Angenommen, Sie haben eine Methode, die ein Rechteck annimmt und passt seine Breite:
public void SetWidth(Rectangle rect, int width)
{
rect.Width = width;
}
Es sollte durchaus sinnvoll sein, da, was ein Rechteck hat keinen Einfluss auf seine Höhe
Rectangle rect = new Rectangle(50, 20); // width, height
SetWidth(rect, 100);
Assert.AreEqual(20, rect.Height);
... weil ein Rechteck der Breite zu ändern: anzunehmen, dass dieser Test bestehen würde.
Nehmen wir an, Sie haben eine neue Square-Klasse aus Rectangle abgeleitet. Per Definition hat ein Quadrat Höhe und Breite immer gleich. Lassen Sie uns diesen Test versuchen Sie es erneut:
Rectangle rect = new Square(20); // both width and height
SetWidth(rect, 100);
Assert.AreEqual(20, rect.Height);
Dieser Test wird fehlschlagen, weil Einstellung auch ein Platz der Breite bis 100 wird seine Höhe verändern.
So wird Likovs Substitutionsprinzip durch Ableiten von Square von Rectangle verletzt.
Die "is-a" -Regel macht Sinn in der "realen Welt" (ein Quadrat ist definitiv eine Art Rechteck), aber nicht immer in der Welt des Software-Designs.
bearbeiten
Ihre Frage zu beantworten, ist die richtige Auslegung sollte wahrscheinlich, dass sowohl Rechteck und Quadrat von einem gemeinsamen „Polygon“ oder „Shape“ Klasse abgeleitet werden, die alle Regeln in Bezug auf Breite oder Höhe nicht durchsetzen wird .
Zweites Beispiel, sollte die Bestätigung für 50 testen? BTW, in der "realen Welt" ist ein Quadrat entweder nicht veränderbar (Zeichnet auf einer Seite) oder es kann aufhören, ein Quadrat zu sein, wenn eine Kraft angewendet wird (es besteht aus Gummi), IOW in der realen Welt kann ein Objekt Ändere dynamisch den Typ, den wir in Programmiersprachen nicht gut modellieren. – AnthonyWJones
Hoppla auf dem zweiten Beispiel gut entdeckt. Der Test ist richtig - der Ctor-Parameter ist falsch. Zwischenablage-Erbenfehler! Ich werde es jetzt reparieren. –