Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Quando si definisce una classe che eredita da una classe di base, a volte si vuole ridefinire uno o più degli elementi della classe base nella classe derivata. L'ombreggiatura e l'override sono entrambi disponibili a questo scopo.
Confronto
L'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. Ma ci sono differenze significative tra i due.
Nella tabella seguente viene confrontata l'ombreggiatura con l'override.
| Confronto tra punti | Ombreggiamento | Override |
|---|---|---|
| Scopo | Protegge da una successiva modifica della classe 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 chiamante1 |
| Elemento ridefinito | Qualsiasi tipo di elemento dichiarato | Solo una procedura (Function, Sub, o Operator) o una proprietà |
| Ridefinizione dell'elemento | Qualsiasi tipo di elemento dichiarato | Solo una routine o una proprietà con la sequenza chiamante identica1 |
| Livello di accesso per la ridefinizione dell'elemento | Qualsiasi livello di accesso | Impossibile modificare il livello di accesso dell'elemento sovrascritto |
| Leggibilità e scrivibilità della ridefinizione dell'elemento | Qualsiasi combinazione | Impossibile modificare la leggibilità o la scrittura della proprietà sottoposta a override |
| Controllo sulla ridefinizione | L'elemento della classe base non può applicare o impedire l'ombreggiatura | L'elemento della classe base può specificare MustOverride, NotOverridableo Overridable |
| Utilizzo delle parole chiave |
Shadows consigliato nella classe derivata; Shadows si assume se né Shadows né Overrides sono specificati2 |
Overridable o MustOverride obbligatorio nella classe base; Overrides obbligatorio nella classe derivata |
| Ereditarietà della ridefinizione dell'elemento in base alle classi che derivano dalla classe derivata | Elemento oscuramento ereditato da ulteriori classi derivate; elemento oscurato ancora nascosto3 | Sovrascrittura dell'elemento ereditato da classi ulteriormente derivate; l'elemento sovrascritto rimane comunque sovrascritto |
1 La sequenza chiamante è costituita dal tipo di elemento (Function, Sub, Operatoro 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, Subo Operator) con un altro tipo.
2 Se non si specifica o Shadows o Overrides, il compilatore genera un messaggio di avviso per garantire di sapere quale tipo di ridefinizione si desidera utilizzare. Se si ignora l'avviso, viene usato il meccanismo di ombreggiatura.
3 Se l'elemento shadowing non è accessibile in un'altra classe derivata, il shadowing non viene ereditato. Ad esempio, se si dichiara l'elemento shadowing come Private, una classe che deriva dalla classe derivata eredita l'elemento originale anziché l'elemento shadowing.
Istruzioni
In genere si usa l'override nei casi seguenti:
Si definiscono classi derivate polimorfiche.
Si desidera avere la sicurezza che il compilatore applichi il tipo di elemento identico e la corretta sequenza di chiamata.
In genere si usa l'ombreggiatura nei casi seguenti:
Si prevede che la classe di base possa essere modificata e che venga definito un elemento con lo stesso nome.
Si desidera la libertà di modificare il tipo di elemento o la sequenza chiamante.