C# kann immer noch das Substitutionsprinzip Liskov anzuwenden.
Bedenken Sie:
public class Base1
{
}
public class Derived1 : Base1
{
}
public class Base2
{
public virtual Base1 Method()
{
return new Base1();
}
}
public class Derived2 : Base2
{
public override Base1 Method()
{
return new Derived1();
}
}
Wenn C# kovarianten Rückgabetypen unterstützt, dann ist die Überschreibung für Method()
in Base2
konnte thusly deklariert werden:
public class Derived2 : Base2
{
public override Derived1 Method()
{
return new Derived1();
}
}
C# dies nicht zulässt, und Sie müssen die erklären Rückgabetyp der gleiche wie in der Basisklasse, nämlich Base1
.
Dies macht jedoch keine Verletzung des Liskov-Substitutionsprinzips.
Bedenken Sie:
Base2 test = new Base2();
Base1 item = test.Method();
Im Vergleich zu:
Base2 test = new Derived2();
Base1 item = test.Method();
Wir sind vollständig in der Lage new Base2()
mit new Derived2()
ohne Probleme zu ersetzen. Dies entspricht dem Liskov-Substitutionsprinzip.
Sie mißverstehen. Die Kovarianz vom Rückgabetyp ist nicht dasselbe wie der Rückgabewert, der kovariant ist. Es bedeutet nur, dass Sie die Methode nicht mit einem anderen Rückgabetyp überschreiben können. Es ist immer noch vollkommen in Ordnung, eine Instanz eines abgeleiteten Typs von einer Methode zurückzugeben, die den Basistyp zurückgibt - ein abgeleiteter Typ ist immer noch ein Subtyp des Basistyps; LSP passt immer noch gut. – Luaan