2013-02-06 3 views
6

Ich bin nicht vertraut mit dem Wort "Subtype" nach dem Blick auf the wikipedia article.Wenn sich Likov Substitution auf Subtypen bezieht, handelt es sich dabei um abgeleitete Klassen im Kontext von C#?

nahm ich Liskov Substitution bedeutet, wenn Sie eine Methode, die eine Animal dauert, sollten Sie in der Lage Effekte passieren in einem Cat oder einem Animal wo Cat : Animal ohne unbeabsichtigte Neben.

Ist das, was Liskov Substitution bezieht?

+5

Ja, im Grunde genommen. Natürlich werden * normalerweise * unterscheidbare Unterschiede sein, sonst würden wir uns nicht mit verschiedenen Unterklassen befassen - aber solange sie alle dem Vertrag der Schnittstelle/Basisklasse gehorchen, und das ist alles, worauf der Client angewiesen ist, sollte alles funktionieren. (Ich fand, das war zu einfach, um als Antwort hinzuzufügen.) –

+3

Warum abstimmen, um diese Frage als "nicht konstruktiv" zu schließen? – ken2k

+0

Danke, ich war mir nicht sicher, ob es sich vielleicht darauf bezieht, wie man Typen wie int/double anstelle von anderen verwenden kann. Wenn Sie es in das Antwortfeld eingeben, kann ich es als Antwort markieren. – NibblyPig

Antwort

3

Genau. Alles, was ein Tier braucht, sollte in der Lage sein, einen Hund, eine Katze und Unterklassen (Rassen, wenn Sie mögen) zu nehmen. Die Methoden werden kompatibel sein.

Beachten Sie auch, dass Vorbedingungen in einem Subtyp nicht gestärkt werden können und Nachbedingungen nicht abgeschwächt werden können. Andernfalls könnten Sie einen bestimmten Subtype einfügen, und dieser würde brechen, weil der umgebende Code bestimmte Vorbedingungen auferlegt hat, die die Unterklasse nicht tolerieren konnte. Dies kann in der Praxis schwierig zu implementieren sein - siehe the circle/ellipse problem für weitere Informationen.

+0

+1 für Pre-und Post-Bedingungen. Denn darum geht es, wenn man über Liskov im Kontext einer stark typisierten Sprache spricht. –

+0

Das sieht interessant aus, lese es jetzt. Ich habe mich gefragt, wie Sie genau gegen dieses Prinzip verstoßen, denn aufgrund der starken Eingabe von C# können Sie nicht auf Eigenschaften zugreifen, die nicht versehentlich existieren. – NibblyPig

+0

Würdest du sagen, dass das Liskov-Prinzip in dieser Situation gebrochen wird, weil ein "Kreis" keine Art von "Ellipse" ist? Und das wird dadurch bewiesen, dass 'stretchX' keine gültige Operation auf einem' Circle' ist? – NibblyPig

0

Ja. Das Likov-Substitutionsprinzip besagt, dass, wenn ein Programmmodul eine Basisklasse verwendet, der Verweis auf die Basisklasse durch eine abgeleitete Klasse ersetzt werden kann, ohne die Funktionalität des Programmmoduls zu beeinträchtigen.