Nozioni fondamentali sull'ereditarietà
Aggiornamento: novembre 2007
L'istruzione Inherits consente di dichiarare una nuova classe, denominata classe derivata, basata su una classe esistente, nota come classe base. Nelle classi derivate vengono ereditati e possono essere estesi proprietà, metodi, eventi, campi e costanti definiti nella classe base. Nella sezione seguente vengono descritte alcune delle regole dell'ereditarietà e i modificatori che possono essere utilizzati per modificare le modalità con cui le classi ereditano o sono ereditate:
Per impostazione predefinita, tutte le classi sono ereditabili a meno che non siano contrassegnate dalla parola chiave NotInheritable. A una classe è consentito ereditare da altre classi del progetto o da classi di altri assembly cui il progetto fa riferimento.
A differenza dei linguaggi che consentono l'ereditarietà multipla, Visual Basic consente solo l'ereditarietà singola nelle classi. In altre parole, alle classi derivate è consentito ereditare da una sola classe base. Sebbene nelle classi non sia consentita l'ereditarietà multipla, al loro interno è consentito implementare più interfacce in grado di svolgere in modo efficace la stessa funzione.
Per impedire l'esposizione di elementi limitati di una classe base, è necessario che il tipo di accesso di una classe derivata sia uguale o più restrittivo di quello della classe base. Una classe Public non può ad esempio ereditare una classe Friend o Private e una classe Friend non può ereditare una classe Private.
Modificatori di ereditarietà
Per supportare l'ereditarietà in Visual Basic sono stati introdotti le istruzioni e i modificatori a livello di classe:
Istruzione Inherits - Consente di specificare la classe base.
Modificatore NotInheritable - Utilizzato per impedire ai programmatori di utilizzare la classe come classe base.
Modificatore MustInherit - Consente di specificare che la classe può essere utilizzata solo come classe base. Non è possibile creare direttamente istanze delle classi MustInherit. Tali classi possono essere create soltanto come istanze di classe base di una classe derivata. In altri linguaggi di programmazione, come C++ e C#, questo tipo di classe viene indicato con il termine classe astratta.
Override di proprietà e metodi nelle classi derivate
In base all'impostazione predefinita, in una classe derivata vengono ereditati metodi e proprietà della classe base relativa. Se è necessario che una proprietà o un metodo ereditato si comportino in modo diverso nella classe derivata è possibile eseguirne l'override. È possibile definire una nuova implementazione del metodo nella classe derivata. I seguenti modificatori consentono di controllare le modalità di override di proprietà e metodi:
Overridable - Consente di eseguire l'override di una proprietà o di un metodo di una classe all'interno di una classe derivata.
Overrides - Consente di eseguire l'override di una proprietà o di un metodo Overridable definito nella classe base.
NotOverridable - Consente di impedire l'override di una proprietà o un metodo in una classe che eredita. Per impostazione predefinita, i metodi Public sono NotOverridable.
MustOverride - Utilizzato per eseguire l'override della proprietà o del metodo in una classe derivata. Quando si utilizza la parola chiave MustOverride, la definizione del metodo consiste solo dell'istruzione Sub, Function o Property. Non sono consentite altre istruzioni, in modo specifico, End Sub o End Function. I metodi MustOverride devono essere dichiarati nelle classi MustInherit.
Per ulteriori informazioni sull'override dei metodi, vedere Override di proprietà e metodi.
La parola chiave MyBase
La parola chiave MyBase consente di chiamare i metodi di una classe base quando si esegue l'override dei metodi in una classe derivata. Si supponga, ad esempio, di progettare una classe derivata che consente di eseguire l'override di un metodo ereditato dalla classe base. Con il metodo sottoposto a override è possibile chiamare il metodo della classe base e modificare il valore restituito come indicato nel frammento di codice seguente:
Class DerivedClass
Inherits BaseClass
Public Overrides Function CalculateShipping( _
ByVal Dist As Double, _
ByVal Rate As Double) _
As Double
' Call the method in the base class and modify the return value.
Return MyBase.CalculateShipping(Dist, Rate) * 2
End Function
End Class
Nell'elenco seguente sono indicate le limitazioni relative all'utilizzo di MyBase:
MyBase si riferisce alla classe base immediatamente superiore nella gerarchia e ai relativi membri ereditati. Non può essere utilizzata per accedere ai membri Private della classe.
MyBase è una parola chiave e non un oggetto reale. Pertanto, non può essere assegnata a una variabile, passata a routine o utilizzata in un confronto Is.
Il metodo qualificato da MyBase non necessita di una definizione nella classe base immediata. È invece possibile definire tale metodo in una classe base ereditata in modo indiretto. Affinché un riferimento qualificato da MyBase venga compilato correttamente, è necessario che una classe base contenga un metodo corrispondente al nome e ai tipi di parametri presenti nella chiamata.
Non è possibile utilizzare MyBase per chiamare metodi MustOverride della classe base.
MyBase non può essere utilizzato per qualificare se stesso. Pertanto, il codice seguente non è valido:
MyBase.MyBase.BtnOK_Click()
MyBase non può essere utilizzato nei moduli.
Se la classe base si trova in un assembly diverso, non sarà possibile utilizzare MyBase per accedere ai membri della classe base contrassegnati come Friend.
La parola chiave MyClass
La parola chiave MyClass consente di chiamare un metodo Overridable implementato nella classe e di verificare che venga chiamata l'implementazione del metodo di questa classe anziché di un metodo sottoposto a override di una classe derivata.
MyClass è una parola chiave e non un oggetto reale. Pertanto, non può essere assegnata a una variabile, passata a routine o utilizzata in un confronto Is.
MyClass si riferisce alla classe che la contiene e ai relativi membri ereditati.
MyClass può essere utilizzata come qualificatore per i membri Shared.
MyClass non può essere utilizzata nei moduli standard.
MyClass può essere utilizzata per qualificare un metodo definito in una classe base e per il quale non è disponibile un'implementazione in tale classe. Questo riferimento ha lo stesso significato di MyBase.Method.
Vedere anche
Attività
Procedura: creare classi derivate
Concetti
Override di proprietà e metodi