2011-09-24 14 views
6

Ho una classe base che voglio fornire alcune funzionalità 'base' per i metodi per tutte le classi ereditanti.Differenza tra nuovo e override?

Nelle mie classi che ereditano che voglio fare:

public override void Setup() 
{ 
    base.Setup(); 
} 

Ma nel momento in cui dice che devo utilizzare la nuova parola chiave.

Come ottenerlo, quindi devo utilizzare la parola chiave override?

C'è qualche differenza tra il modo in cui è al momento con me utilizzando la parola chiave new e utilizzando override?

+3

http://msdn.microsoft.com/en-us/library/ms173153%28v=VS.100%29.aspx – MPelletier

+1

possibile duplicato di [C# utilizzo della parola chiave virtual + override vs. new] (http: // stackoverflow.com/questions/159978/c-keyword-usage-virtualoverride-vs-new) – MPelletier

+0

grazie che era un ottimo link – Blankman

risposta

7

Lo dice perché non è stato dichiarato il metodo di base virtual. Una volta eseguita questa operazione, la coppia virtual/derivata override derivata di base avrà senso. In questo momento, il compilatore si sta lamentando del fatto che non è possibile utilizzare un metodo non virtual non virtual.

+3

... e solo i metodi 'virtuali' possono essere sovrascritti. –

4

Quando si utilizza la parola chiave override, il metodo derivato viene utilizzato anche quando l'istanza viene passata come tipo di classe Base. Quindi ci deve essere un virtuale nella classe base in modo che il programma sappia che deve eseguire un controllo di runtime su quale sia il tipo effettivo dell'istanza. Quindi cerca il tipo effettivo e se è un tipo derivato controlla se il loro è un override nella classe derivata per quel particolare metodo nella classe base.

L'occultamento del membro è diverso. Il membro di base verrà nascosto solo se viene effettivamente passato come un'istanza della classe derivata. Se l'oggetto viene passato come una classe base, verrà comunque utilizzato il metodo della classe base. Se nascondi un membro, ricevi un avviso se non hai utilizzato la nuova parola chiave. La nuova parola chiave è solo per dire al compilatore, che vuoi veramente nascondere il metodo del tipo di base.