Megosztás a következőn keresztül:


Öröklési alapismeretek (Visual Basic)

Az Inherits utasítás egy új, származtatott osztálynak nevezett osztály deklarálásához használható egy meglévő osztály alapján, amelyet alaposztálynak nevezünk. A származtatott osztályok öröklik és bővíthetik az alaposztályban definiált tulajdonságokat, metódusokat, eseményeket, mezőket és állandókat. A következő szakasz az öröklés néhány szabályát, valamint azokat a módosítókat ismerteti, amelyekkel megváltoztathatja az osztályok öröklési módját vagy azt, hogyan öröklődnek.

  • Alapértelmezés szerint minden osztály örökölhető, kivéve, ha a NotInheritable kulcsszóval van megjelölve. Az osztályok örökölhetnek más osztályoktól a projektben, vagy a projekt által hivatkozott más könyvtárak osztályaitól.

  • A több öröklést lehetővé tevő nyelvektől eltérően a Visual Basic csak egyetlen öröklést engedélyez az osztályokban; vagyis a származtatott osztályoknak csak egy alaposztályuk lehet. Bár az osztályokban több öröklés nem engedélyezett, az osztályok több interfészt is implementálhatnak, amelyek hatékonyan érik el ugyanazt a célt.

  • A korlátozott elemek alaposztályban való felfedésének megakadályozása érdekében a származtatott osztály hozzáférési típusának meg kell egyenlõnek vagy szigorúbbnak kell lennie, mint az alaposztálya. Egy Public osztály például nem örökölhet egy Friend vagy egy Private osztályt, és egy Friend osztály nem örökölhet egy Private osztályt.

Öröklési módosítók

A Visual Basic az alábbi osztályszintű utasításokat és módosítókat mutatja be az öröklés támogatásához:

  • Inherits utasítás – Az alaposztályt adja meg.

  • NotInheritable módosító – Megakadályozza, hogy a programozók alaposztályként használják az osztályt.

  • MustInherit módosító – Azt határozza meg, hogy az osztály csak alaposztályként használható. Az osztályok példányai MustInherit nem hozhatók létre közvetlenül, csak származtatott osztály alaposztálypéldányaként hozhatók létre. (Más programozási nyelvek, például a C++ és a C# az absztrakt osztály kifejezést használják egy ilyen osztály leírására.)

Tulajdonságok és metódusok felülírása származtatott osztályokban

A származtatott osztály alapértelmezés szerint az alaposztályától örökli a tulajdonságokat és a metódusokat. Ha egy örökölt tulajdonságnak vagy metódusnak másképp kell viselkednie a származtatott osztályban, felülírhatjuk. Ez azt is jelentheti, hogy a metódus új implementációját definiálhatja a származtatott osztályban. A tulajdonságok és metódusok felülírási módjának szabályozásához a következő módosítókat használjuk:

  • Overridable — Lehetővé teszi, hogy egy osztály egy tulajdonsága vagy metódusa felül legyen bírálva egy származtatott osztályban.

  • Overrides — Felülbírálja az alaposztályban definiált Overridable tulajdonságot vagy metódust.

  • NotOverridable — Megakadályozza, hogy egy tulajdonság vagy metódus felülíródjon egy öröklő osztályban. Alapértelmezés szerint a Public metódusok a következők NotOverridable: .

  • MustOverride — Megköveteli, hogy egy származtatott osztály felülbírálja a tulajdonságot vagy metódust. MustOverride A kulcsszó használatakor a metódusdefiníció csak az , Subvagy Function utasításból Propertyáll. Más utasítás nem engedélyezett, és konkrétan nincs End Sub vagy End Function utasítás. MustOverride metódusokat osztályban MustInherit kell deklarálni.

Tegyük fel, hogy osztályokat szeretne definiálni a bérszámfejtés kezeléséhez. Meghatározhat egy általános Payroll osztályt, amely egy olyan metódust RunPayroll tartalmaz, amely egy átlagos hét bérszámfejtési adatait számítja ki. Ezután Payroll használhatja alaposztályként egy specializáltabb BonusPayroll osztályhoz, amely felhasználható az alkalmazottak bónuszainak elosztásakor.

Az BonusPayroll osztály örökölheti és felülbírálhatja az PayEmployee alaposztályban Payroll definiált metódust.

Az alábbi példa egy alaposztályt Payrollés egy származtatott osztályt határoz meg, BonusPayrollamely felülír egy örökölt metódust PayEmployee. Egy eljárás, RunPayrollamely létrehozza és átadja egy Payroll objektumot és egy BonusPayroll objektumot egy függvénynek, Payamely mindkét objektum metódusát végrehajtja 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

A MyBase kulcsszó

A MyBase kulcsszó úgy viselkedik, mint egy objektumváltozó, amely az osztály aktuális példányának alaposztályára hivatkozik. MyBase gyakran használják olyan alaposztálytagok elérésére, amelyeket egy származtatott osztályban felülírnak vagy elrejtenek. Az MyBase.New kifejezetten arra szolgál, hogy egy származtatott osztálykonstruktorból meghívjunk egy alaposztály-konstruktort.

Tegyük fel például, hogy olyan származtatott osztályt tervez, amely felülbírálja az alaposztálytól örökölt metódust. A felülírt metódus meghívhatja a metódust az alaposztályban, és módosíthatja a visszatérési értéket az alábbi kódtöredékben látható módon:

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

Az alábbi lista a következő MyBasekorlátozások használatát ismerteti:

  • MyBase az azonnali alaposztályra és annak örökölt tagjaira vonatkozik. Nem használható az osztálytagok elérésére Private .

  • MyBase egy kulcsszó, nem valódi objektum. MyBase nem rendelhető hozzá változóhoz, nem adható át eljárásoknak, és nem használható összehasonlításban Is .

  • A minősítő metódust MyBase nem kell az azonnali alaposztályban definiálni, hanem közvetetten öröklődő alaposztályban lehet definiálni. Ahhoz, hogy egy MyBase által minősített hivatkozás helyesen kompilálódjon, valamely alaposztálynak tartalmaznia kell egy metódust, amely megfelel a hívásban megjelenő névnek és paramétertípusoknak.

  • Nem használhatja a MyBase a MustOverride alaposztály metódusainak hívására.

  • MyBase nem használható önmaga minősítésére. Ezért a következő kód érvénytelen:

    MyBase.MyBase.BtnOK_Click()

  • MyBase modulban nem használható.

  • MyBase Nem használható olyan alaposztálytagok elérésére, amelyek úgy vannak megjelölve, mintha Friend az alaposztály egy másik szerelvényben lenne.

További információ és egy másik példa : Hogyan érhet el rejtett változót származtatott osztály által.

A MyClass kulcsszó

A MyClass kulcsszó úgy viselkedik, mint egy objektumváltozó, amely az eredetileg implementált osztály aktuális példányára hivatkozik. MyClass hasonlít Me-re, de minden metódus- és tulajdonsághívás MyClass úgy lesz kezelve, mintha a metódus vagy a tulajdonság NotOverridable lenne. Ezért a metódust vagy tulajdonságot nem befolyásolja egy származtatott osztály felülírása.

  • MyClass egy kulcsszó, nem valódi objektum. MyClass nem rendelhető hozzá változóhoz, nem adható át eljárásoknak, és nem használható összehasonlításban Is .

  • MyClass az azt tartalmazó osztályra és annak örökölt tagjaira hivatkozik.

  • MyClass használható minősítőként a Shared tagokhoz.

  • MyClass nem használható metóduson Shared belül, de egy példánymetóduson belül is használható egy osztály megosztott tagjának eléréséhez.

  • MyClass standard modulokban nem használható.

  • MyClass egy alaposztályban definiált és az adott osztályban megadott metódus implementálásával nem rendelkező metódus minősítésére használható. Az ilyen hivatkozás jelentése megegyezik a metódus jelentésével.MyBase.

Az alábbi példa összehasonlítja a Me és a 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

Annak ellenére, hogy derivedClass felülbírálja a testMethod-t, a MyClass kulcsszó useMyClass semlegesíti a felülbírálás hatásait, és a fordító a hívást az alaposztály testMethod verziójára oldja fel.

Lásd még