Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Instrukcja Inherits służy do deklarowania nowej klasy nazywanej klasą pochodną na podstawie istniejącej klasy znanej jako klasa bazowa. Klasy pochodne dziedziczą i mogą rozszerzać właściwości, metody, zdarzenia, pola i stałe zdefiniowane w klasie bazowej. W poniższej sekcji opisano niektóre reguły dziedziczenia, a modyfikatory, których można użyć do zmiany sposobu dziedziczenia klas lub są dziedziczone:
Domyślnie wszystkie klasy są dziedziczone, chyba że są oznaczone
NotInheritablesłowem kluczowym. Klasy mogą dziedziczyć z innych klas w projekcie lub z klas w innych zestawach, do których odwołuje się projekt.W przeciwieństwie do języków, które zezwalają na wiele dziedziczenia, Visual Basic zezwala tylko na pojedyncze dziedziczenie w klasach; oznacza to, że klasy pochodne mogą mieć tylko jedną klasę bazową. Mimo że wiele dziedziczenia nie jest dozwolone w klasach, klasy mogą implementować wiele interfejsów, co może skutecznie osiągnąć te same końce.
Aby zapobiec uwidacznianiu elementów z ograniczeniami w klasie bazowej, typ dostępu klasy pochodnej musi być równy lub bardziej restrykcyjny niż jej klasa bazowa. Na przykład
Publicklasa nie może dziedziczyćFriendklasy lubPrivate, aFriendklasa nie może dziedziczyćPrivateklasy.
Modyfikatory dziedziczenia
W języku Visual Basic wprowadzono następujące instrukcje i modyfikatory na poziomie klasy w celu obsługi dziedziczenia:
Inheritsinstrukcja — określa klasę bazową.NotInheritablemodyfikator — uniemożliwia programistom używanie klasy jako klasy bazowej.MustInheritmodyfikator — określa, że klasa jest przeznaczona tylko do użycia jako klasa bazowa.MustInheritNie można utworzyć bezpośrednio wystąpień klas. Można je utworzyć tylko jako wystąpienia klasy bazowej klasy pochodnej. (Inne języki programowania, takie jak C++ i C#, używają terminu klasa abstrakcyjna do opisania takiej klasy).
Zastępowanie właściwości i metod w klasach pochodnych
Domyślnie klasa pochodna dziedziczy właściwości i metody z klasy bazowej. Jeśli dziedziczona właściwość lub metoda musi zachowywać się inaczej w klasie pochodnej, może zostać zastąpiona. Oznacza to, że można zdefiniować nową implementację metody w klasie pochodnej. Następujące modyfikatory służą do kontrolowania sposobu zastępowania właściwości i metod:
Overridable— Umożliwia zastąpienie właściwości lub metody w klasie w klasie pochodnej.Overrides— zastępuje właściwość lub metodę zdefiniowanąOverridablew klasie bazowej.NotOverridable— uniemożliwia zastąpienie właściwości lub metody w klasie dziedziczonej. DomyślniePublicmetody toNotOverridable.MustOverride— Wymaga, aby klasa pochodna zastąpiła właściwość lub metodę.MustOverrideGdy słowo kluczowe jest używane, definicja metody składa się tylko z instrukcjiSub,FunctionlubProperty. Żadne inne instrukcje nie są dozwolone, a w szczególności nieEnd Subma instrukcji aniEnd Function.MustOverridemetody muszą być deklarowane wMustInheritklasach.
Załóżmy, że chcesz zdefiniować klasy do obsługi listy płac. Można zdefiniować klasę ogólną Payroll zawierającą metodę RunPayroll , która oblicza listę płac dla typowego tygodnia. Następnie można użyć Payroll jako klasy bazowej dla bardziej wyspecjalizowanej BonusPayroll klasy, która może być używana podczas dystrybucji premii pracowników.
Klasa BonusPayroll może dziedziczyć i zastępować metodę zdefiniowaną PayEmployee w klasie bazowej Payroll .
W poniższym przykładzie zdefiniowano klasę bazową , Payrolli klasę pochodną , BonusPayrollktóra zastępuje dziedziczona metodę PayEmployee. Procedura, RunPayroll, tworzy, a następnie przekazuje Payroll obiekt i BonusPayroll obiekt do funkcji , Payktóra wykonuje PayEmployee metodę obu obiektów.
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
Słowo kluczowe MyBase
Słowo MyBase kluczowe zachowuje się jak zmienna obiektu, która odwołuje się do klasy bazowej bieżącego wystąpienia klasy.
MyBase jest często używany do uzyskiwania dostępu do składowych klasy bazowej, które są zastępowane lub w tle w klasie pochodnej. W szczególności MyBase.New służy do jawnego wywoływania konstruktora klasy bazowej z konstruktora klasy pochodnej.
Załóżmy na przykład, że projektujesz klasę pochodną, która zastępuje metodę dziedziczona z klasy bazowej. Metoda zastąpiona może wywołać metodę w klasie bazowej i zmodyfikować wartość zwracaną, jak pokazano w poniższym fragcie kodu:
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
Poniższa lista zawiera opis ograniczeń dotyczących używania programu MyBase:
MyBaseodwołuje się do natychmiastowej klasy bazowej i jej odziedziczonych składowych. Nie można jej używać do uzyskiwania dostępuPrivatedo składowych w klasie.MyBasejest słowem kluczowym, a nie prawdziwym obiektem.MyBasenie można przypisać do zmiennej, przekazanej do procedur lub użytejIsw porównaniu.Metoda, która
MyBasekwalifikuje się, nie musi być zdefiniowana w bezpośredniej klasie bazowej; zamiast tego może być zdefiniowana w pośrednio dziedziczonej klasie bazowej. Aby odwołanie kwalifikowane przezMyBaseprogram w celu poprawnego skompilowania, niektóre klasy bazowe muszą zawierać metodę zgodną z nazwą i typami parametrów wyświetlanych w wywołaniu.Nie można używać
MyBasemetody do wywoływaniaMustOverridemetod klasy bazowej.MyBasenie można użyć do zakwalifikowania się. W związku z tym następujący kod jest nieprawidłowy:MyBase.MyBase.BtnOK_Click()MyBasenie można używać w modułach.MyBaseNie można używać do uzyskiwania dostępu do składowych klasy bazowej, które są oznaczone tak, jakbyFriendklasa bazowa znajduje się w innym zestawie.
Aby uzyskać więcej informacji i inny przykład, zobacz Jak uzyskać dostęp do zmiennej ukrytej przez klasę pochodną.
Słowo kluczowe MyClass
Słowo MyClass kluczowe zachowuje się jak zmienna obiektu, która odwołuje się do bieżącego wystąpienia klasy jako pierwotnie zaimplementowanej.
MyClass
Meprzypomina metodę , ale każde wywołanie MyClass metody i właściwości jest traktowane tak, jakby metoda lub właściwość nie były możliwe do zastąpienia. W związku z tym metoda lub właściwość nie ma wpływu na zastąpienie w klasie pochodnej.
MyClassjest słowem kluczowym, a nie prawdziwym obiektem.MyClassnie można przypisać do zmiennej, przekazanej do procedur lub użytejIsw porównaniu.MyClassodwołuje się do zawierającej klasy i jej dziedziczone elementy członkowskie.MyClassmoże być używany jako kwalifikator dlaSharedczłonków.MyClassnie można użyć wewnątrzSharedmetody, ale można jej użyć wewnątrz metody wystąpienia, aby uzyskać dostęp do udostępnionego elementu członkowskiego klasy.MyClassnie można używać w modułach standardowych.MyClassMoże służyć do kwalifikowania metody zdefiniowanej w klasie bazowej i nie ma implementacji metody podanej w tej klasie. Takie odwołanie ma takie samo znaczenie jakMyBase.metoda.
Poniższy przykład porównuje i MeMyClass.
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
Mimo przesłonięcia derivedClasstestMethodMyClass słowo kluczowe w useMyClass parametrze nullifuje skutki zastąpienia, a kompilator rozpoznaje wywołanie do wersji klasy bazowej testMethodklasy .