Dela via


Arvsgrunder (Visual Basic)

-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 Public inte ärva en Friend eller en Private klass, och en Friend klass kan inte ärva en Private klass.

Arvsmodifierare

Visual Basic introducerar följande instruktioner och modifierare på klassnivå för att stödja arv:

  • Inherits statement – Anger basklassen.

  • NotInheritable modifier – Förhindrar programmerare från att använda klassen som basklass.

  • MustInherit modifier – Anger att klassen endast är avsedd att användas som basklass. Det går inte att skapa instanser av MustInherit klasser 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 en Overridable egenskap eller metod som definierats i basklassen.

  • NotOverridable — Förhindrar att en egenskap eller metod åsidosättas i en ärvd klass. Som standard Public är NotOverridablemetoderna .

  • MustOverride – Kräver att en härledd klass åsidosätter egenskapen eller metoden. När nyckelordet MustOverride används består metoddefinitionen av bara - , Functioneller Property -instruktionenSub. Inga andra instruktioner tillåts, och specifikt finns det ingen End Sub eller End Function -instruktion. MustOverride måste deklareras i MustInherit klasser.

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, , BonusPayrollsom å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:

  • MyBase avser den omedelbara basklassen och dess ärvda medlemmar. Det kan inte användas för att komma åt Private medlemmar i klassen.

  • MyBase är ett nyckelord, inte ett verkligt objekt. MyBase kan inte tilldelas till en variabel, skickas till procedurer eller användas i en Is jämförelse.

  • Den metod som MyBase kvalificerar 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 kompileras MyBase korrekt måste en basklass innehålla en metod som matchar namnet och typerna av parametrar som visas i anropet.

  • Du kan inte använda MyBase för att anropa MustOverride basklassmetoder.

  • MyBase kan inte användas för att kvalificera sig själv. Därför är följande kod ogiltig:

    MyBase.MyBase.BtnOK_Click()

  • MyBase kan inte användas i moduler.

  • MyBase kan inte användas för att komma åt basklassmedlemmar som är markerade som Friend om 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. MyClassMeliknar , 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. MyClass kan inte tilldelas till en variabel, skickas till procedurer eller användas i en Is jämförelse.

  • MyClass avser den innehållande klassen och dess ärvda medlemmar.

  • MyClass kan användas som en kvalificerare för Shared medlemmar.

  • MyClass kan inte användas i en Shared metod, men kan användas i en instansmetod för att få åtkomst till en delad medlem i en klass.

  • MyClass kan inte användas i standardmoduler.

  • MyClass kan 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 som MyBase.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.

Se även