Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
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
NotInheritabletrefwoord. 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
Publicklasse kan bijvoorbeeld geenFriendof eenPrivateklasse overnemen en eenFriendklasse kan geenPrivateklasse overnemen.
Overnameaanpassingen
Visual Basic introduceert de volgende instructies en modifiers op klasseniveau ter ondersteuning van overname:
Inheritsinstructie : hiermee geeft u de basisklasse op.NotInheritablemodifier : hiermee voorkomt u dat programmeurs de klasse als basisklasse gebruiken.MustInheritmodifier : geeft aan dat de klasse alleen is bedoeld voor gebruik als basisklasse. Exemplaren vanMustInheritklassen 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 eenOverridableeigenschap of methode die is gedefinieerd in de basisklasse.NotOverridable— Hiermee voorkomt u dat een eigenschap of methode wordt overschreven in een overnemende klasse.PublicStandaard zijn methoden.NotOverridableMustOverride— Vereist dat een afgeleide klasse de eigenschap of methode overschrijft. Wanneer hetMustOverridetrefwoord wordt gebruikt, bestaat de methodedefinitie uit alleen deSub,FunctionofPropertyinstructie. Er zijn geen andere instructies toegestaan en er is specifiek geenEnd SubofEnd Functioneen instructie.MustOverridemethoden moeten worden gedeclareerd inMustInheritklassen.
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 Payrollen 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:
MyBaseverwijst naar de directe basisklasse en de overgenomen leden. Het kan niet worden gebruikt voor toegang totPrivateleden in de klas.MyBaseis een trefwoord, geen echt object.MyBasekan niet worden toegewezen aan een variabele, doorgegeven aan procedures of worden gebruikt in eenIsvergelijking.De methode die
MyBasein 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 voorMyBasehet 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.MyBasekan niet worden gebruikt om zichzelf te kwalificeren. Daarom is de volgende code niet geldig:MyBase.MyBase.BtnOK_Click()MyBasekan niet worden gebruikt in modules.MyBasekan niet worden gebruikt voor toegang tot basisklasseleden die zijn gemarkeerd alsofFriendde 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
Melijkt 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.
MyClassis een trefwoord, geen echt object.MyClasskan niet worden toegewezen aan een variabele, doorgegeven aan procedures of worden gebruikt in eenIsvergelijking.MyClassverwijst naar de betreffende klasse en de overgenomen leden.MyClasskan worden gebruikt als kwalificatie voorSharedleden.MyClasskan niet worden gebruikt binnen eenSharedmethode, maar kan worden gebruikt binnen een exemplaarmethode om toegang te krijgen tot een gedeeld lid van een klasse.MyClasskan niet worden gebruikt in standaardmodules.MyClasskan 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 testMethod onderdrukkingen MyClassuseMyClass de gevolgen van het overschrijven nullifeert en de compiler de aanroep van de basisklasseversie van testMethod.