Nozioni fondamentali sull'ereditarietà (Visual Basic)

L'istruzione viene usata per dichiarare una nuova classe, denominata classe derivata , basata su una Inherits classe esistente, nota come classe di base . Le classi derivate ereditano e possono estendere le proprietà, i metodi, gli eventi, i campi e le costanti definiti nella classe di base. La sezione seguente descrive alcune regole per l'ereditarietà e i modificatori che è possibile usare per modificare il modo in cui le classi ereditano o vengono ereditate:

  • Per impostazione predefinita, tutte le classi sono ereditabili a meno che non siano contrassegnate con la NotInheritable parola chiave . Le classi possono ereditare da altre classi nel progetto o da classi in altri assembly a cui fa riferimento il progetto.

  • A differenza dei linguaggi che consentono l'ereditarietà multipla, Visual Basic l'ereditarietà singola nelle classi. ciò significa che le classi derivate possono avere una sola classe di base. Anche se l'ereditarietà multipla non è consentita nelle classi, le classi possono implementare più interfacce, che possono effettivamente raggiungere gli stessi obiettivi.

  • Per impedire l'esposizione di elementi con restrizioni in una classe di base, il tipo di accesso di una classe derivata deve essere uguale o più restrittivo rispetto alla relativa classe di base. Ad esempio, una classe non può ereditare una classe o e Public una classe non può Friend Private Friend ereditare una Private classe.

Modificatori di ereditarietà

Visual Basic introduce le istruzioni e i modificatori a livello di classe seguenti per supportare l'ereditarietà:

  • Inherits statement : specifica la classe di base.

  • NotInheritable modifier : impedisce ai programmatori di usare la classe come classe di base.

  • MustInherit modifier : specifica che la classe deve essere utilizzata solo come classe base. Le istanze delle classi non possono essere create direttamente, ma solo MustInherit come istanze della classe base di una classe derivata. Altri linguaggi di programmazione, ad esempio C++ e C#, usano il termine classe astratta per descrivere tale classe.

Override di proprietà e metodi nelle classi derivate

Per impostazione predefinita, una classe derivata eredita proprietà e metodi dalla relativa classe di base. Se una proprietà o un metodo ereditato deve comportarsi in modo diverso nella classe derivata, è possibile eseguire l'override di. Ciò significa che è 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 l'override di una proprietà o di un metodo in una classe in una classe derivata.

  • Overrides : esegue l'override Overridable di una proprietà o di un metodo definito nella classe di base.

  • NotOverridable : impedisce l'override di una proprietà o di un metodo in una classe che eredita. Per impostazione predefinita, Public i metodi sono NotOverridable .

  • MustOverride : richiede che una classe derivata ese sostituisca la proprietà o il metodo. Quando si MustOverride usa la parola chiave , la definizione del metodo è costituita solo dall'istruzione Sub , o Function Property . Non sono consentite altre istruzioni e in particolare non è presente End Sub alcuna istruzione End Function o . MustOverride I metodi devono essere dichiarati nelle MustInherit classi.

Si supponga di voler definire classi per gestire le retribuzioni. È possibile definire una classe Payroll generica che contiene un RunPayroll metodo che calcola le retribuzioni per una tipica settimana. È quindi possibile usare come classe di base per una classe più specializzata, che può essere usata quando si distribuiscono i Payroll BonusPayroll bonus dei dipendenti.

La BonusPayroll classe può ereditare ed eseguire PayEmployee l'override del metodo definito nella classe di Payroll base.

Nell'esempio seguente vengono definite una classe base e una classe Payroll, derivata, BonusPayroll , che esegue l'override di un metodo ereditato, PayEmployee . Una routine, , crea e quindi passa un oggetto e un oggetto a una RunPayroll Payroll BonusPayroll funzione, Pay , che esegue il metodo di entrambi gli PayEmployee oggetti.

Const BonusRate As Decimal = 1.45D
Const PayRate As Decimal = 14.75D

Class Payroll
    Overridable Function PayEmployee(
        ByVal HoursWorked As Decimal,
        ByVal PayRate As Decimal) As Decimal

        PayEmployee = HoursWorked * PayRate
    End Function
End Class

Class BonusPayroll
    Inherits Payroll
    Overrides Function PayEmployee(
        ByVal HoursWorked As Decimal,
        ByVal PayRate As Decimal) As Decimal

        ' The following code calls the original method in the base 
        ' class, and then modifies the returned value.
        PayEmployee = MyBase.PayEmployee(HoursWorked, PayRate) * BonusRate
    End Function
End Class

Sub RunPayroll()
    Dim PayrollItem As Payroll = New Payroll
    Dim BonusPayrollItem As New BonusPayroll
    Dim HoursWorked As Decimal = 40

    MsgBox("Normal pay is: " &
        PayrollItem.PayEmployee(HoursWorked, PayRate))
    MsgBox("Pay with bonus is: " &
        BonusPayrollItem.PayEmployee(HoursWorked, PayRate))
End Sub

Parola chiave MyBase

La MyBase parola chiave si comporta come una variabile oggetto che fa riferimento alla classe di base dell'istanza corrente di una classe. MyBase viene spesso usato per accedere ai membri della classe base sottoposti a override o sottoposti a shadowed in una classe derivata. In particolare, MyBase.New viene usato per chiamare in modo esplicito un costruttore della classe base da un costruttore di classe derivata.

Si supponga, ad esempio, di progettare una classe derivata che esegue l'override di un metodo ereditato dalla classe base. Il metodo sottoposto a override può chiamare il metodo nella classe di base e modificare il valore restituito come illustrato 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 vengono descritte le restrizioni relative all'utilizzo di MyBase :

  • MyBase fa riferimento alla classe base immediata e ai relativi membri ereditati. Non può essere usato per accedere Private ai membri nella classe .

  • MyBase è una parola chiave, non un oggetto reale. MyBase non può essere assegnato a una variabile, passato a routine o utilizzato in un Is confronto.

  • Il metodo qualificato non deve essere definito nella classe di base immediata, ma può essere definito in una classe MyBase di base ereditata indirettamente. Perché un riferimento qualificato da venga compilato correttamente, alcune classi di base devono contenere un metodo corrispondente al nome e ai tipi di parametri MyBase visualizzati nella chiamata.

  • Non è possibile usare MyBase per chiamare metodi della classe MustOverride base.

  • MyBase non può essere usato per qualificarsi. Di conseguenza, il codice seguente non è valido:

    MyBase.MyBase.BtnOK_Click()

  • MyBase non può essere usato nei moduli.

  • MyBase non può essere usato per accedere ai membri della classe base contrassegnati come Friend se la classe di base si trova in un assembly diverso.

Per altre informazioni e un altro esempio, vedere Procedura: Accedere a una variabile nascosta da una classe derivata.

Parola chiave MyClass

La MyClass parola chiave si comporta come una variabile oggetto che fa riferimento all'istanza corrente di una classe come implementata in origine. MyClassè simile a , ma ogni chiamata di metodo e proprietà su viene considerata come se il metodo o Me MyClass la proprietà fosse NotOverridable. Pertanto, il metodo o la proprietà non è interessato dall'override in una classe derivata.

  • MyClass è una parola chiave, non un oggetto reale. MyClass non può essere assegnato a una variabile, passato a routine o utilizzato in un Is confronto.

  • MyClass fa riferimento alla classe contenitore e ai relativi membri ereditati.

  • MyClass può essere usato come qualificatore per i Shared membri.

  • MyClass non può essere usato all'interno di un metodo, ma può essere usato all'interno di un metodo di istanza per accedere Shared a un membro condiviso di una classe.

  • MyClass non può essere usato nei moduli standard.

  • MyClass può essere usato per qualificare un metodo definito in una classe di base e che non dispone di alcuna implementazione del metodo fornito in tale classe. Tale riferimento ha lo stesso significato del MyBase. metodo.

Nell'esempio seguente vengono Me confrontati e MyClass .

Class baseClass
    Public Overridable Sub testMethod()
        MsgBox("Base class string")
    End Sub
    Public Sub useMe()
        ' The following call uses the calling class's method, even if
        ' that method is an override.
        Me.testMethod()
    End Sub
    Public Sub useMyClass()
        ' The following call uses this instance's method and not any
        ' override.
        MyClass.testMethod()
    End Sub
End Class
Class derivedClass : Inherits baseClass
    Public Overrides Sub testMethod()
        MsgBox("Derived class string")
    End Sub
End Class
Class testClasses
    Sub startHere()
        Dim testObj As derivedClass = New derivedClass()
        ' The following call displays "Derived class string".
        testObj.useMe()
        ' The following call displays "Base class string".
        testObj.useMyClass()
    End Sub
End Class

Anche se esegue l'override di , la parola chiave in annulla gli effetti dell'override e il compilatore risolve la chiamata derivedClass alla versione della classe base di testMethod MyClass useMyClass testMethod .

Vedi anche