Gibt es eine Möglichkeit, kovariante Überschreibungen in C# zu "hacken" oder "zu erzwingen"?Problemumgehung für fehlende Kovarianz vom Rückgabetyp beim Überschreiben virtueller Methoden
Zum Beispiel:
public class Alpha {
public virtual Alpha DoSomething() {
return AlphaFactory.GetAlphaFromSomewhere();
}
}
public class Beta : Alpha {
public override Beta DoSomething() {
return BetaFactory.GetBetaFromSomewhere();
}
}
Leider ist C# nicht unterstützt (was ein bisschen lächerlich scheint, aber das ist weder hier noch dort).
Ich dachte, ich könnte eine Antwort mit der Methode versteckt habe:
new public Beta DoSomething() {
return BetaFactory.GetBetaFromSomewhere();
}
Aber nicht fügen Sie den Eintrag in der ‚V-Tabelle‘, es im Grunde nur eine völlig neue Methode mit dem gleichen Namen erklärt, und als solches bedeutet, dass der Zugriff auf Beta
s über einen Zeiger auf Alpha
Alpha.DoSomething()
aufrufen wird.
Also, irgendwelche guten Tricks?
Warum müssen Sie den Rückgabewert ändern? Was erfüllt Ihre Bedürfnisse nicht, wenn 'Beta.DoSomething()' ein 'Alpha'-getipptes Objekt zurückgibt? Solange die richtigen Methoden als virtuell in 'Alpha' definiert und dann in' Beta' überschrieben werden, ist es nicht wirklich wichtig; Jeder Aufruf einer virtuellen Methode wird in den Laufzeittyp des Objekts aufgelöst, nicht in den Kompilierungszeittyp. – InBetween
Wird nicht genug von einem "Hack" geworfen? – Mephy