Podstawowe informacje o dziedziczeniu (Visual Basic)
Inherits Instrukcji jest używany do zadeklarować nową klasę o nazwie klasy, oparte na istniejącej klasy, znany jako klasy bazowej.Klasy pochodne dziedziczą i można rozszerzyć, właściwości, metody, zdarzenia, pól i stałe zdefiniowane w klasie podstawowej.W poniższej sekcji opisano niektóre zasady dla dziedziczenia i modyfikatorów, których można użyć, aby zmienić sposób klasy dziedziczą lub dziedziczone są:
Domyślnie, wszystkie klasy są dziedziczone, chyba że oznaczone NotInheritable słowa kluczowego.Klasy mogą dziedziczyć z innych klas w projekcie lub klas w innych zestawów, które odwołuje się do projektu.
W przeciwieństwie do języków, które umożliwiają wielokrotne dziedziczenie Visual Basic umożliwia tylko pojedynczy dziedziczenie klas; to znaczy klas pochodnych może mieć tylko jeden klasy podstawowej.Chociaż wielokrotne dziedziczenie nie jest dozwolony w klas, klas można zaimplementować wiele interfejsów, które skutecznie można wykonywać te same cele.
Zapobiegające narażania przedmiotów objętych ograniczeniami w klasie bazowej typ dostępu, pochodna klasy musi być równa lub bardziej restrykcyjne niż jej klasy podstawowej.Na przykład Public klasy nie można dziedziczyć Friend lub Private klasy, a Friend klasy nie można dziedziczyć Private klasy.
Modyfikatory dziedziczenie
Visual Basicwprowadza następujące instrukcje na poziomie klasy i Modyfikatory obsługuje dziedziczenia:
InheritsInstrukcja — określa klasy podstawowej.
NotInheritableModyfikator — uniemożliwia korzystanie z klasy jako klasa podstawowa programistów.
MustInheritModyfikator — Określa, że klasa jest przeznaczone do stosowania jako tylko klasy bazowej.Wystąpienia MustInherit klasy nie można utworzyć bezpośrednio; mogą one tylko tworzone jako wystąpienia klasy podstawowej klasie pochodnej.(Innych językach programowania, takich jak C++ i C#, używany jest termin Klasa abstrakcyjna do opisu takich klasa.)
Zastępowanie właściwości i metod klasy pochodne
Domyślnie pochodna klasy dziedziczy właściwości i metod jego klasy podstawowej.Jeżeli dziedziczone właściwości lub metody ma zachowywać się inaczej w klasie pochodnej może być zastąpiona.Oznacza to, że można zdefiniować nowe implementacji metody w klasie pochodnej.Następujących modyfikatorów są używane do kontroli, w jaki sposób są zastępowane właściwości i metod:
Overridable— Zezwala na właściwość lub metoda w klasie w klasie pochodnej.
Overrides— Zastępuje Overridable właściwość lub metoda zdefiniowana w klasie podstawowej.
NotOverridable— Uniemożliwia właściwości lub metody zastępowaniu dziedziczące klasy.Domyślnie Public metody są NotOverridable.
MustOverride— Wymaga się, że pochodna klasy zastępują właściwości lub metody.Gdy MustOverride użyć słowa kluczowego, definicja metody składa się z tylko na Sub, Function, lub Property instrukcji.Są dozwolone nie inne sprawozdania, a konkretnie jest nie End Sub lub End Function instrukcji.MustOverridemetody muszą być zadeklarowane w MustInherit klasy.
Załóżmy, że do definiowania klas do obsługi listy płac.Można zdefiniować rodzajowego Payroll klasa, która zawiera RunPayroll metodę służącą do obliczania listy płac dla typowych tygodnia.Następnie można użyć Payroll jako klasa podstawowa dla bardziej wyspecjalizowanych BonusPayroll klasy, które mogą być wykorzystane podczas rozdzielania premie pracownika.
BonusPayroll Klasy mogą dziedziczyć i zastąpić, PayEmployee metody zdefiniowanej w bazie Payroll klasy.
Poniższy przykład definiuje klasy bazowej, Payroll, i klasy pochodne, BonusPayroll, który zastępuje metody odziedziczonej, PayEmployee.W procedurze RunPayroll, tworzy i następnie przechodzi Payroll obiektu i BonusPayroll obiektu do funkcji, Pay, który jest wykonywany PayEmployee metoda oba obiekty.
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
MyBase Słowa kluczowego zachowuje się jak zmienna obiektu, która odnosi się do klasy podstawowej bieżące wystąpienie klasy.MyBasejest często używany do dostępu członkowie klasy podstawowej, które są zastępowane lub Cieniowany w klasie pochodnej.W szczególności MyBase.New jest używana do jawnie wywołać konstruktora klasy podstawowej z konstruktora klasy pochodnej.
Na przykład załóżmy, że projektujesz klasy pochodnej, która zastępuje metodę, dziedziczona z klasy bazowej.Zastąpiona metoda może wywołać metodę w klasie bazowej i zmodyfikować zwracanej wartości, jak pokazano w następujący fragment 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
Na poniższej liście opisano ograniczenia przy użyciu MyBase:
MyBaseodnosi się do natychmiastowego klasy podstawowej i jej członków dziedziczonych.Nie mogą być używane do dostępu Private członków w klasie.
MyBasejest słowem kluczowym nie rzeczywistego obiektu.MyBasenie przypisany do zmiennej, przekazany do procedury lub używane w Is porównanie.
Metoda, MyBase kwalifikuje się nie muszą być definiowane w bezpośrednim klasy podstawowej; Zamiast tego może być zdefiniowane w klasie podstawowej pośrednio dziedziczone.W celu odniesienia, zakwalifikowanych przez MyBase do kompilowania poprawnie, niektóre klasy podstawowej musi zawierać pasujące nazwy i typy parametrów, które pojawiają się w wywołaniu metody.
Nie można użyć MyBase do wywołania MustOverride metod klasy base.
MyBasenie można użyć do zakwalifikowania się sam.W związku z tym nie obowiązuje następujący kod:
MyBase.MyBase.BtnOK_Click()
MyBasenie można używać w modułach.
MyBasenie można używać do dostępu członkowie klasy podstawowej, które są oznaczone jako Friend , jeśli klasa base znajduje się w innym zestawie.
Aby uzyskać więcej informacji i innym przykładem, zobacz Porady: dostęp do zmiennej ukrytej przez klasę pochodną (Visual Basic).
Słowo kluczowe MojaKlasa
MyClass Słowa kluczowego zachowuje się jak zmienna obiektu, która odnosi się do bieżącego wystąpienia klasy zaimplementowane w pierwotnie.MyClasspodobny do Me, ale wszystkie metody i właściwości zadzwonić na MyClass jest traktowany tak, jakby były metodę lub właściwość NotOverridable (Visual Basic).W związku z tym metodę lub właściwość nie dotyczy przesłanianie w klasie pochodnej.
MyClassjest słowem kluczowym nie rzeczywistego obiektu.MyClassnie przypisany do zmiennej, przekazany do procedury lub używane w Is porównanie.
MyClassodnosi się do klasy zawierające i jej członków dziedziczonych.
MyClassmogą być używane jako kwalifikator dla Shared członków.
MyClassnie mogą być używane wewnątrz Shared metody, ale mogą być używane wewnątrz metody wystąpienia uzyskać dostępu do udostępnionych członka klasy.
MyClassnie można używać w modułach standardowych.
MyClassmoże służyć do zakwalifikowania się metodę, która jest zdefiniowana w klasie bazowej, i który posiada nie implementacji metody, pod warunkiem że klasy.Takie odniesienie ma takie samo znaczenie jak MyBase.Metoda.
Poniższy przykład porównuje Me i 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
Mimo że derivedClass zastępuje testMethod, MyClass słowa kluczowego w useMyClass pozbawia skutków przesłanianie i rozwiązuje kompilator wywołanie klasy podstawowej wersji testMethod.