Delen via


Basisbeginselen van overname (Visual Basic)

De Inherits instructie wordt gebruikt om een nieuwe klasse, een afgeleide klasse genoemd, te declareren op basis van een bestaande klasse, ook wel een basisklasse genoemd. Afgeleide klassen nemen de eigenschappen, methoden, gebeurtenissen, velden en constanten over die zijn gedefinieerd in de basisklasse en kunnen deze uitbreiden. In de volgende sectie worden enkele van de regels voor overname beschreven en de modifiers die u kunt gebruiken om de manier te wijzigen waarop klassen worden overgenomen of overgenomen:

  • Standaard kunnen alle klassen worden overgenomen, tenzij ze zijn gemarkeerd met het NotInheritable trefwoord. Klassen kunnen overnemen van andere klassen in uw project of van klassen in andere assembly's waarnaar uw project verwijst.

  • In tegenstelling tot talen die meerdere overnames toestaan, staat Visual Basic slechts één overname toe in klassen; Dat wil gezegd, afgeleide klassen kunnen slechts één basisklasse hebben. Hoewel meerdere overnames niet zijn toegestaan in klassen, kunnen klassen meerdere interfaces implementeren, waardoor dezelfde einden effectief kunnen worden bereikt.

  • Om te voorkomen dat beperkte items in een basisklasse worden weergegeven, moet het toegangstype van een afgeleide klasse gelijk zijn aan of meer beperkend zijn dan de basisklasse. Een Public klasse kan bijvoorbeeld geen Friend of een Private klasse overnemen en een Friend klasse kan geen Private klasse overnemen.

Overnameaanpassingen

Visual Basic introduceert de volgende instructies en modifiers op klasseniveau ter ondersteuning van overname:

  • Inherits instructie : hiermee geeft u de basisklasse op.

  • NotInheritable modifier : hiermee voorkomt u dat programmeurs de klasse als basisklasse gebruiken.

  • MustInherit modifier : geeft aan dat de klasse alleen is bedoeld voor gebruik als basisklasse. Exemplaren van MustInherit klassen kunnen niet rechtstreeks worden gemaakt. Ze kunnen alleen worden gemaakt als basisklasse-exemplaren van een afgeleide klasse. (Andere programmeertalen, zoals C++ en C#, gebruiken de term abstracte klasse om een dergelijke klasse te beschrijven.)

Eigenschappen en methoden in afgeleide klassen overschrijven

Een afgeleide klasse neemt standaard eigenschappen en methoden over van de basisklasse. Als een overgenomen eigenschap of methode zich anders moet gedragen in de afgeleide klasse, kan deze worden overschreven. Dat wil gezegd, u kunt een nieuwe implementatie van de methode in de afgeleide klasse definiëren. De volgende modifiers worden gebruikt om te bepalen hoe eigenschappen en methoden worden overschreven:

  • Overridable — Hiermee kan een eigenschap of methode in een klasse worden overschreven in een afgeleide klasse.

  • Overrides — Overschrijft een Overridable eigenschap of methode die is gedefinieerd in de basisklasse.

  • NotOverridable — Hiermee voorkomt u dat een eigenschap of methode wordt overschreven in een overnemende klasse. Public Standaard zijn methoden.NotOverridable

  • MustOverride — Vereist dat een afgeleide klasse de eigenschap of methode overschrijft. Wanneer het MustOverride trefwoord wordt gebruikt, bestaat de methodedefinitie uit alleen de Sub, Functionof Property instructie. Er zijn geen andere instructies toegestaan en er is specifiek geen End Sub of End Function een instructie. MustOverride methoden moeten worden gedeclareerd in MustInherit klassen.

Stel dat u klassen wilt definiëren voor het afhandelen van salarisadministratie. U kunt een algemene Payroll klasse definiëren die een RunPayroll methode bevat waarmee de salarisadministratie voor een typische week wordt berekend. U kunt vervolgens als basisklasse gebruiken Payroll voor een meer gespecialiseerde BonusPayroll klasse, die kan worden gebruikt bij het distribueren van werknemersbonussen.

De BonusPayroll klasse kan de PayEmployee methode overnemen en overschrijven die is gedefinieerd in de basisklasse Payroll .

In het volgende voorbeeld wordt een basisklasse Payroll, en een afgeleide klasse gedefinieerd, BonusPayrollwaarmee een overgenomen methode wordt overschreven. PayEmployee Een procedure, RunPayrollmaakt en geeft vervolgens een Payroll object en een BonusPayroll object door aan een functie, Paywaarmee de PayEmployee methode van beide objecten wordt uitgevoerd.

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

Het trefwoord MyBase

Het MyBase trefwoord gedraagt zich als een objectvariabele die verwijst naar de basisklasse van het huidige exemplaar van een klasse. MyBase wordt vaak gebruikt voor toegang tot basisklasseleden die worden overschreven of schaduwen in een afgeleide klasse. Met name MyBase.New wordt gebruikt om expliciet een basisklasseconstructor aan te roepen van een afgeleide klasseconstructor.

Stel dat u een afgeleide klasse ontwerpt die een methode overschrijft die is overgenomen van de basisklasse. De overschreven methode kan de methode in de basisklasse aanroepen en de retourwaarde wijzigen, zoals wordt weergegeven in het volgende codefragment:

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

In de volgende lijst worden beperkingen beschreven voor het gebruik van MyBase:

  • MyBase verwijst naar de directe basisklasse en de overgenomen leden. Het kan niet worden gebruikt voor toegang tot Private leden in de klas.

  • MyBase is een trefwoord, geen echt object. MyBase kan niet worden toegewezen aan een variabele, doorgegeven aan procedures of worden gebruikt in een Is vergelijking.

  • De methode die MyBase in aanmerking komt, hoeft niet te worden gedefinieerd in de directe basisklasse. In plaats daarvan kan deze worden gedefinieerd in een indirect overgenomen basisklasse. Om ervoor te zorgen dat een verwijzing die juist is gekwalificeerd voor MyBase het compileren, moet een basisklasse een methode bevatten die overeenkomt met de naam en typen parameters die in de aanroep worden weergegeven.

  • U kunt geen basisklassemethoden aanroepen MyBaseMustOverride .

  • MyBase kan niet worden gebruikt om zichzelf te kwalificeren. Daarom is de volgende code niet geldig:

    MyBase.MyBase.BtnOK_Click()

  • MyBase kan niet worden gebruikt in modules.

  • MyBase kan niet worden gebruikt voor toegang tot basisklasseleden die zijn gemarkeerd alsof Friend de basisklasse zich in een andere assembly bevindt.

Zie Instructies voor meer informatie en een ander voorbeeld : Toegang krijgen tot een variabele die is verborgen door een afgeleide klasse.

Het trefwoord MyClass

Het MyClass trefwoord gedraagt zich als een objectvariabele die verwijst naar het huidige exemplaar van een klasse zoals oorspronkelijk is geïmplementeerd. MyClassMelijkt op , maar elke methode en eigenschap die wordt aangeroepenMyClass, worden behandeld alsof de methode of eigenschap NotOverridable is. De methode of eigenschap wordt daarom niet beïnvloed door het overschrijven in een afgeleide klasse.

  • MyClass is een trefwoord, geen echt object. MyClass kan niet worden toegewezen aan een variabele, doorgegeven aan procedures of worden gebruikt in een Is vergelijking.

  • MyClass verwijst naar de betreffende klasse en de overgenomen leden.

  • MyClass kan worden gebruikt als kwalificatie voor Shared leden.

  • MyClass kan niet worden gebruikt binnen een Shared methode, maar kan worden gebruikt binnen een exemplaarmethode om toegang te krijgen tot een gedeeld lid van een klasse.

  • MyClass kan niet worden gebruikt in standaardmodules.

  • MyClass kan worden gebruikt om een methode te kwalificeren die is gedefinieerd in een basisklasse en die geen implementatie van de methode in die klasse heeft. Een dergelijke verwijzing heeft dezelfde betekenis als MyBase.methode.

In het volgende voorbeeld worden de vergelijkingen Me en 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

derivedClass Hoewel het trefwoord in useMyClass onderdrukkingen testMethodMyClass de gevolgen van het overschrijven nullifeert en de compiler de aanroep van de basisklasseversie van testMethod.

Zie ook