esiste un modo per eseguire l'override covariante di "hack" o "coerce" in C#?Soluzione alternativa per mancanza di tipo covarianza di ritorno quando si annullano i metodi virtuali
Ad esempio:
public class Alpha {
public virtual Alpha DoSomething() {
return AlphaFactory.GetAlphaFromSomewhere();
}
}
public class Beta : Alpha {
public override Beta DoSomething() {
return BetaFactory.GetBetaFromSomewhere();
}
}
Purtroppo, C# non supporta questo (che sembra un po 'ridicolo, ma questo è né qui né là).
ho pensato che avrei potuto avere una risposta con il metodo del nascondiglio:
new public Beta DoSomething() {
return BetaFactory.GetBetaFromSomewhere();
}
ma questo non aggiungere la voce dentro al 'vtable', dichiara appena fondamentalmente un metodo nuovo di zecca con lo stesso nome, e come tale significa che l'accesso a Beta
attraverso un puntatore a un Alpha
chiamerà Alpha.DoSomething()
.
Quindi, qualche buon trucco?
Perché è necessario modificare il valore restituito? Cosa non soddisfa le tue esigenze nel fatto che 'Beta.DoSomething()' restituisca un oggetto digitato 'Alpha'? Finché i metodi giusti sono definiti come virtuali in 'Alpha' e poi sovrascritti in' Beta', non ha molta importanza; qualsiasi chiamata a un metodo virtuale si risolverà nel tipo di runtime dell'oggetto, non nel tipo di tempo di compilazione. – InBetween
Non sta lanciando abbastanza di un "hack"? – Mephy