Ö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 ismerteti az öröklés néhány szabályát, valamint azokat a módosítókat, amelyeket az osztályok öröklésének vagy öröklésének módosításához használhat:
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 a projekt más osztályaitól vagy a projekt által hivatkozott más szerelvények 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 osztály például
Public
nem örökölhet egyFriend
vagy több osztálytPrivate
, az osztály pedigFriend
nem örökölhet osztálytPrivate
.
Ö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ányaiMustInherit
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 lehet bírálni. 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áltOverridable
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 aPublic
metódusok a következőkNotOverridable
: .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 ,Function
vagyProperty
utasításbólSub
áll. Más utasítás nem engedélyezett, és konkrétan nincsEnd Sub
vagyEnd Function
utasítás.MustOverride
metódusokat osztálybanMustInherit
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, BonusPayroll
amely felülír egy örökölt metódust PayEmployee
. Egy eljárás, RunPayroll
amely létrehozza és átadja egy Payroll
objektumot és egy BonusPayroll
objektumot egy függvénynek, Pay
amely 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, amelyek felül vannak bírálva vagy árnyékoltak egy származtatott osztályban. Az MyBase.New
alaposztály-konstruktorok kifejezetten egy származtatott osztálykonstruktorból való meghívására szolgálnak.
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ő MyBase
korlá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érePrivate
.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ásbanIs
.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 hivatkozás megfelelően legyen lefordítvaMyBase
, néhány alaposztálynak tartalmaznia kell egy metódust, amely megfelel a hívásban megjelenő paraméterek nevének és típusainak.Alaposztály-metódusok nem hívhatók
MyBase
MustOverride
meg.MyBase
nem használható a minősítésre. 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, minthaFriend
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
Me
hasonlít, de minden metódus és tulajdonság hívása MyClass
úgy lesz kezelve, mintha a metódus vagy a tulajdonság NotOverridable lett volna. 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ásbanIs
.MyClass
az azt tartalmazó osztályra és annak örökölt tagjaira hivatkozik.MyClass
a tagok minősítőjekéntShared
használható.MyClass
nem használható metódusonShared
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 és összehasonlítja a MyClass
következőtMe
:
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
A felülbírálások testMethod
ellenére derivedClass
a MyClass
kulcsszó useMyClass
null értékűre állítja a felülbírálás hatásait, és a fordító feloldja a hívását a főosztály alaposztályának testMethod
verziójára.
Lásd még
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: