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é Shadows né Overrides 2 |
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.