Condividi tramite


Differenze tra shadowing e override (Visual Basic)

Quando si definisce una classe che eredita da una classe di base, a volte si vogliono ridefinire uno o più elementi della classe di base nella classe derivata. A questo scopo è possibile usare sia lo shadowing che l'override.

Confronto

Lo shadowing e l'override vengono usati entrambi quando una classe derivata eredita da una classe di base ed entrambi ridefiniscono un elemento dichiarato con un altro. Esistono tuttavia sono differenze significative tra i due.

Il confronto tra shadowing e override viene illustrato nella tabella seguente.

Termine di confronto Shadowing Override
Scopo Protegge da una successiva modifica della classe di base che introduce un membro già definito nella classe derivata Ottiene il polimorfismo definendo un'implementazione diversa di una routine o di una proprietà con la stessa sequenza di chiamata1
Elemento ridefinito Qualsiasi tipo di elemento dichiarato Solo una routine (Function, Sub o Operator) o una proprietà
Elemento di ridefinizione Qualsiasi tipo di elemento dichiarato Solo una routine o una proprietà con la stessa sequenza di chiamata1
Livello di accesso dell'elemento di ridefinizione Qualsiasi livello di accesso Non è possibile modificare il livello di accesso dell'elemento sottoposto a override
Leggibilità e scrivibilità dell'elemento di ridefinizione Qualsiasi combinazione Non è possibile modificare la leggibilità o la scrittura della proprietà sottoposta a override
Controllo sulla ridefinizione L'elemento della classe di base non può applicare o impedire lo shadowing L'elemento della classe di base può specificare MustOverride, NotOverridable o Overridable
Utilizzo delle parole chiave Shadows è consigliata nella classe derivata; si presuppone Shadows se non viene specificata né ShadowsOverrides2 Overridable o MustOverride è obbligatoria nella classe di base; Overrides è obbligatoria nella classe derivata
Ereditarietà dell'elemento di ridefinizione dalle classi che derivano dalla classe derivata Elemento per lo shadowing ereditato da ulteriori classi derivate; l'elemento sottoposto a shadowing rimane ancora nascosto3 Elemento per l'override ereditato da ulteriori classi derivate; l'elemento sottoposto a override rimane tale

1 La sequenza di chiamata è costituita da tipo di elemento (Function, Sub, Operator o Property), nome, elenco di parametri e tipo restituito. Non è possibile eseguire l'override di una routine con una proprietà o viceversa. Non è possibile eseguire l'override di un tipo di routine (Function, Sub o Operator) con un altro tipo.

2 Se non si specifica Shadows o Overrides, il compilatore genera un messaggio di avviso che consente di verificare il tipo di ridefinizione da usare. Se si ignora l'avviso, viene usato il meccanismo di shadowing.

3 Se l'elemento per lo shadowing non è accessibile in un'ulteriore classe derivata, lo shadowing non viene ereditato. Ad esempio, se si dichiara l'elemento per lo shadowing come Private, una classe derivata dalla propria classe derivata eredita l'elemento originale invece dell'elemento per lo shadowing.

Linee guida

L'override viene usato in genere nei casi seguenti:

  • Si intendono definire classi derivate polimorfiche.

  • Si vuole essere sicuri che il compilatore applichi lo stesso tipo di elemento e la stessa sequenza di chiamata.

Lo shadowing viene usato in genere nei casi seguenti:

  • Si prevede che la classe di base possa essere modificata e si definisce un elemento usando lo stesso nome di quella propria.

  • Si vuole modificare liberamente il tipo di elemento o la sequenza di chiamata.

Vedi anche