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 geenFriend
of eenPrivate
klasse overnemen en eenFriend
klasse kan geenPrivate
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 vanMustInherit
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 eenOverridable
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 hetMustOverride
trefwoord wordt gebruikt, bestaat de methodedefinitie uit alleen deSub
,Function
ofProperty
instructie. Er zijn geen andere instructies toegestaan en er is specifiek geenEnd Sub
ofEnd Function
een instructie.MustOverride
methoden moeten worden gedeclareerd inMustInherit
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, BonusPayroll
waarmee een overgenomen methode wordt overschreven. PayEmployee
Een procedure, RunPayroll
maakt en geeft vervolgens een Payroll
object en een BonusPayroll
object door aan een functie, Pay
waarmee 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 totPrivate
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 eenIs
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 voorMyBase
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
MyBase
MustOverride
.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 alsofFriend
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. MyClass
Me
lijkt 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 eenIs
vergelijking.MyClass
verwijst naar de betreffende klasse en de overgenomen leden.MyClass
kan worden gebruikt als kwalificatie voorShared
leden.MyClass
kan niet worden gebruikt binnen eenShared
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 alsMyBase.
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 testMethod
MyClass
de gevolgen van het overschrijven nullifeert en de compiler de aanroep van de basisklasseversie van testMethod
.