Czy istnieje sposób na "hakowanie" lub "przymus" korektorów kowariancyjnych w C#?Obejście problemu z powodu braku kowariancji typu powrotu przy zastępowaniu metod wirtualnych
Na przykład:
public class Alpha {
public virtual Alpha DoSomething() {
return AlphaFactory.GetAlphaFromSomewhere();
}
}
public class Beta : Alpha {
public override Beta DoSomething() {
return BetaFactory.GetBetaFromSomewhere();
}
}
Niestety, C# nie obsługuje tej funkcji (co wydaje się nieco śmieszne, ale to ani tu ani tam).
Myślałem, że mam odpowiedź metodą ukrycia:
new public Beta DoSomething() {
return BetaFactory.GetBetaFromSomewhere();
}
Ale to nie dodać wpis w do „vtable”, to po prostu w zasadzie deklaruje nową metodę o tej samej nazwie, i jako taki oznacza, że dostęp do Beta
s przez wskaźnik do Alpha
wywoła Alpha.DoSomething()
.
A więc jakieś dobre sztuczki?
Dlaczego trzeba zmienić wartość zwracaną? Co nie jest w stanie zaspokoić twoich potrzeb, ponieważ 'Beta.DoSomething()' zwraca obiekt typu "Alpha"? Dopóki właściwe metody są zdefiniowane jako wirtualne w 'Alfa', a następnie nadpisane w' Beta', tak naprawdę nie ma to znaczenia; każde wywołanie metody wirtualnej spowoduje rozpoznanie typu środowiska wykonawczego obiektu, a nie typu czasu kompilacji. – InBetween
Nie rzuca wystarczająco dużo "hack"? – Mephy