Perché è necessario/override obbligatorio sui metodi astratti ma non sui metodi virtuali?Design C#: perché è necessario/override obbligatorio sui metodi astratti ma non sui metodi virtuali?
Esempio 1:
abstract class ShapesClass
{
abstract public int Area(); // abstract!
}
class Square : ShapesClass
{
int x, y;
public int Area() // Error: missing 'override' or 'new'
{
return x * y;
}
}
Il compilatore mostrerà questo errore: Per rendere il membro corrente ignorare che l'attuazione, aggiungere la parola chiave override. In caso contrario, aggiungere la nuova parola chiave
Esempio 2:
class ShapesClass
{
virtual public int Area() { return 0; } // it is virtual now!
}
class Square : ShapesClass
{
int x, y;
public int Area() // no explicit 'override' or 'new' required
{
return x * y;
}
}
Questo compilerà bene, nascondendo il metodo di default.
Capisco perfettamente le differenze tecniche. Tuttavia mi chiedo perché il linguaggio sia stato progettato in quel modo. Non sarebbe meglio avere la stessa restrizione anche nel "Campione 2"? Voglio dire nella maggior parte dei casi se crei un metodo con lo stesso nome della classe genitore, di solito intendi sovrascriverlo. Quindi penso che affermare esplicitamente Override/New avrebbe senso anche sui metodi virtuali.
Esiste un motivo di progettazione per questo comportamento?
Aggiornamento: Il secondo campione causa effettivamente un avviso. Il primo esempio mostra un errore perché la sottoclasse è necessaria per implementare il metodo astratto. Non ho visto l'avviso in VS .. ha perfettamente senso per me ora. Grazie.
Se hai ragione (non hanno avuto il tempo di controllare) allora sembra un bug nel compilatore; Mi aspetterei che avvertisse in entrambi i casi. Quale versione del compilatore stai usando? –
Non sono sicuro del motivo per cui non si ottiene un errore, ma è necessario eseguire l'override o una nuova IS su un override virtuale e l'esempio sopra riportato NON viene compilato. –
Viene visualizzato un avviso: "Avviso 'StackOverflow_Test.Square.Area()' nasconde il membro ereditato 'Stackoverflow_Test.ShapesClass.Area()'. Per fare in modo che il membro corrente sostituisca tale implementazione, aggiungere la parola chiave override. la nuova parola chiave. " –