Ich habe einige Vererbungsfragen, da ich eine Gruppe von zusammenhängenden abstrakten Klassen habe, die alle zusammen überschrieben werden müssen, um eine Client-Implementierung zu erstellen. Im Idealfall würde Ich mag so etwas wie die folgenden Funktionen ausführen:Warum funktioniert die Vererbung nicht so, wie ich denke, dass sie funktionieren sollte?
abstract class Animal
{
public Leg GetLeg() {...}
}
abstract class Leg { }
class Dog : Animal
{
public override DogLeg Leg() {...}
}
class DogLeg : Leg { }
Dies jemand erlauben würde, die Dog-Klasse automatisch Doglegs und alle bekommt die Tier-Klasse Beine zu bekommen. Das Problem besteht darin, dass die überschriebene Funktion den gleichen Typ wie die Basisklasse haben muss, damit diese nicht kompiliert wird. Ich verstehe nicht, warum das nicht so sein sollte, denn DogLeg ist implizit auf Leg legal. Ich weiß, dass es viele Möglichkeiten gibt, aber ich bin neugierig, warum dies in C# nicht möglich ist.
BEARBEITEN: Ich habe dies etwas geändert, da ich tatsächlich Eigenschaften anstelle von Funktionen in meinem Code verwende.
EDIT: Habe ich es zu Funktionen zurück, weil die Antwort auf diese Situation (Kovarianz auf dem Wert Parameter einer Set-Eigenschaft Funktion soll nicht Arbeit) gilt nur. Entschuldigung für die Schwankungen! Mir ist klar, dass viele Antworten irrelevant erscheinen.
Ihre Aussage zur Abweichung macht keinen Sinn. In einem Subtyp: Covariance = der verwandte Typ wird untergeteilt & Contravariance = verwandter Typ wird supertypisiert. Diese Frage stellt einen Kovarianten-Rückgabetyp (Untertyp in einem Subtyp) dar, wenn C# nur einen invarianten (gleichen) Rückgabetyp zulässt. –
Die Artikel, die Sie verlinkt haben, handeln von generischen Varianztypen. Die Frage betrifft die Kovarianz vom Rückgabetyp. Ich stelle in diesen Artikeln ausdrücklich fest, dass ich * nicht * über Rückgabetyp-Kovarianz spreche. –
Eric Lippert: Aber diese Dinge sind untrennbar miteinander verbunden. Siehe hier: http://apocalisp.wordpress.com/2009/08/27/hostility-toward-subtyping/ – Apocalisp