2013-05-02 10 views
7

Nella mia sottoclasse, dovrei fare riferimento a un metodo non virtuale protetto ereditato come this.Method() o base.Method()?questo. vs base. per metodi non virtuali protetti ereditati?

L'utilizzo di this mi consente di nascondere facilmente il metodo con un nuovo metodo con lo stesso nome. Le chiamate al metodo dovrebbero specificare esplicitamente lo base solo quando è certo che solo l'implementazione della classe base deve essere chiamata in modo specifico?

+1

si dovrebbe sempre chiamare this.Method() quando si chiama e si esegue una chiamata base :: Method() dai metodi sovrascritti implementati all'interno della classe derivata. In questo modo, in futuro, quando esegui l'override di qualcosa, non devi andare in giro a fare una base.Method(); –

+0

Non è un metodo virtuale e non può essere sovrascritto. I metodi non virtuali possono essere nascosti. – Monstieur

+2

Perché non ci si riferisce semplicemente a 'Method()'? Se 'this' lo nasconde con il suo' Method() 'allora verrà chiamato. In caso contrario, verrà chiamato 'base.Method()'. Questo è stato scelto come comportamento predefinito; probabilmente per buone ragioni.^_^ – Corak

risposta

2

Chiama sempre utilizzando this.Method().

Se si nasconde il metodo, è probabile che si desideri chiamare il nuovo metodo anziché quello nella classe base. D'altra parte, se rendi virtuale il metodo della classe base, probabilmente vorrai che il tuo codice chiami se in modo polimorfico.

È difficile prevedere il futuro, ma è più probabile che questi scenari si verifichino.

7

Se si desidera aggiungere un membro denominato Method nella sottoclasse e si desidera comunque richiamare il metodo ereditato, è necessario utilizzare base.Method(). L'aggiunta di membri denominati Method in più classi derivate non modificherà il significato di invocazione this.Method().

Problemi correlati