Not
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
-instruktionen Inherits används för att deklarera en ny klass, kallad en härledd klass, baserat på en befintlig klass, känd som en basklass. Härledda klasser ärver och kan utöka de egenskaper, metoder, händelser, fält och konstanter som definierats i basklassen. I följande avsnitt beskrivs några av reglerna för arv och de modifierare som du kan använda för att ändra hur klasser ärver eller ärvs:
Som standard är alla klasser ärverbara om de inte har markerats med nyckelordet
NotInheritable. Klasser kan ärva från andra klasser i projektet eller från klasser i andra sammansättningar som projektet refererar till.Till skillnad från språk som tillåter flera arv tillåter Visual Basic endast enskilt arv i klasser. Härledda klasser kan alltså bara ha en basklass. Även om flera arv inte tillåts i klasser kan klasser implementera flera gränssnitt, vilket effektivt kan uppnå samma mål.
För att förhindra att begränsade objekt exponeras i en basklass måste åtkomsttypen för en härledd klass vara lika med eller mer restriktiv än basklassen. En klass kan till exempel
Publicinte ärva enFriendeller enPrivateklass, och enFriendklass kan inte ärva enPrivateklass.
Arvsmodifierare
Visual Basic introducerar följande instruktioner och modifierare på klassnivå för att stödja arv:
Inheritsstatement – Anger basklassen.NotInheritablemodifier – Förhindrar programmerare från att använda klassen som basklass.MustInheritmodifier – Anger att klassen endast är avsedd att användas som basklass. Det går inte att skapa instanser avMustInheritklasser direkt. De kan bara skapas som basklassinstanser av en härledd klass. (Andra programmeringsspråk, till exempel C++ och C#, använder termen abstrakt klass för att beskriva en sådan klass.)
Åsidosättande egenskaper och metoder i härledda klasser
Som standard ärver en härledd klass egenskaper och metoder från basklassen. Om en ärvd egenskap eller metod måste bete sig annorlunda i den härledda klassen kan den åsidosättas. Du kan alltså definiera en ny implementering av metoden i den härledda klassen. Följande modifierare används för att styra hur egenskaper och metoder åsidosättas:
Overridable– Tillåter att en egenskap eller metod i en klass åsidosättas i en härledd klass.Overrides— Åsidosätter enOverridableegenskap eller metod som definierats i basklassen.NotOverridable— Förhindrar att en egenskap eller metod åsidosättas i en ärvd klass. Som standardPublicärNotOverridablemetoderna .MustOverride– Kräver att en härledd klass åsidosätter egenskapen eller metoden. När nyckelordetMustOverrideanvänds består metoddefinitionen av bara - ,SubellerFunction-instruktionenProperty. Inga andra instruktioner tillåts, och specifikt finns det ingenEnd SubellerEnd Function-instruktion.MustOverridemåste deklareras iMustInheritklasser.
Anta att du vill definiera klasser för att hantera löneuppgifter. Du kan definiera en allmän Payroll klass som innehåller en RunPayroll metod som beräknar löner för en typisk vecka. Du kan sedan använda Payroll som basklass för en mer specialiserad BonusPayroll klass, som kan användas när du distribuerar medarbetarbonusar.
Klassen BonusPayroll kan ärva och åsidosätta den PayEmployee metod som definierats i basklassen Payroll .
I följande exempel definieras en basklass, Payroll, och en härledd klass, BonusPayroll, som åsidosätter en ärvd metod, PayEmployee. En procedur, RunPayroll, skapar och skickar sedan ett Payroll objekt och ett BonusPayroll objekt till en funktion, Pay, som kör metoden för båda objekten PayEmployee .
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
Nyckelordet MyBase
Nyckelordet MyBase fungerar som en objektvariabel som refererar till basklassen för den aktuella instansen av en klass.
MyBase används ofta för att komma åt basklassmedlemmar som åsidosätts eller skuggas i en härledd klass. I synnerhet MyBase.New används för att uttryckligen anropa en basklasskonstruktor från en härledd klasskonstruktor.
Anta till exempel att du utformar en härledd klass som åsidosätter en metod som ärvts från basklassen. Den åsidosatta metoden kan anropa metoden i basklassen och ändra returvärdet enligt följande kodfragment:
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
I följande lista beskrivs begränsningar för användning av MyBase:
MyBaseavser den omedelbara basklassen och dess ärvda medlemmar. Det kan inte användas för att komma åtPrivatemedlemmar i klassen.MyBaseär ett nyckelord, inte ett verkligt objekt.MyBasekan inte tilldelas till en variabel, skickas till procedurer eller användas i enIsjämförelse.Den metod som
MyBasekvalificerar behöver inte definieras i den omedelbara basklassen. Den kan i stället definieras i en indirekt ärvd basklass. För att en referens ska kunna kompilerasMyBasekorrekt måste en basklass innehålla en metod som matchar namnet och typerna av parametrar som visas i anropet.Du kan inte använda
MyBaseför att anropaMustOverridebasklassmetoder.MyBasekan inte användas för att kvalificera sig själv. Därför är följande kod ogiltig:MyBase.MyBase.BtnOK_Click()MyBasekan inte användas i moduler.MyBasekan inte användas för att komma åt basklassmedlemmar som är markerade somFriendom basklassen finns i en annan sammansättning.
Mer information och ett annat exempel finns i How to: Access a Variable Hidden by a Derived Class (Så här gör du: Åtkomst till en variabel dold av en härledd klass).
Nyckelordet MyClass
Nyckelordet MyClass fungerar som en objektvariabel som refererar till den aktuella instansen av en klass som ursprungligen implementerades.
MyClass
Meliknar , men varje metod och egenskapsanrop MyClass behandlas som om metoden eller egenskapen inte kunde åsidosättas. Därför påverkas inte metoden eller egenskapen av åsidosättande i en härledd klass.
MyClassär ett nyckelord, inte ett verkligt objekt.MyClasskan inte tilldelas till en variabel, skickas till procedurer eller användas i enIsjämförelse.MyClassavser den innehållande klassen och dess ärvda medlemmar.MyClasskan användas som en kvalificerare förSharedmedlemmar.MyClasskan inte användas i enSharedmetod, men kan användas i en instansmetod för att få åtkomst till en delad medlem i en klass.MyClasskan inte användas i standardmoduler.MyClasskan användas för att kvalificera en metod som definieras i en basklass och som inte har någon implementering av metoden som anges i den klassen. En sådan referens har samma betydelse somMyBase.metoden.
I följande exempel jämförs Me och 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
Även om derivedClass åsidosättningar testMethod, nullifierar nyckelordet MyClass i useMyClass effekterna av åsidosättning, och kompilatorn löser anropet till basklassversionen av testMethod.