Sdílet prostřednictvím


Základní informace o dědičnosti (Visual Basic)

Inherits Deklarovat nové třídy, nazvané použití příkazu odvozené třídy, na základě existující třídy, známé jako základní třídy.Odvozené třídy dědí a rozšířit, vlastnosti, metody, události, polí a konstant definovanou ve třídě base.Následující část popisuje některá pravidla pro dědění a modifikátorů, které můžete změnit způsob, jakým třídy dědí nebo jsou zděděny:

  • Standardně jsou všechny třídy dědičná, pokud není označena NotInheritable klíčové slovo.Třídy mohou dědit z jiných tříd v projektu nebo třídy v jiné sestavení, které odkazuje na projekt.

  • Na rozdíl od jazyky, které umožňují vícenásobné dědění Visual Basic umožňuje pouze jediný dědičnost tříd; odvozené třídy, může mít pouze jeden základní třídy.Přestože vícenásobné dědění není povoleno tříd, třídy mohou implementovat více rozhraní, které lze účinně provádět stejné zakončení.

  • Chcete-li zabránit úniku zakázaných předmětů v základní třídě, musí být typ přístupu odvozené třídy rovná nebo je více omezující než základní třída.Například Public třída nemůže dědit Friend nebo Private třídy a Friend třída nemůže dědit Private třídy.

Modifikátory dědičnosti

Visual Basiczavádí následující příkazy úrovně třídy a modifikátory pro podporu dědičnosti:

  • Inheritsprohlášení – určuje základní třídy.

  • NotInheritableModifikátor – zabrání programátoři pomocí třídy jako základní třída.

  • MustInheritModifikátor – Určuje, že třída je určena pro použití jako základní třída.Instance MustInherit třídy nelze vytvořit přímo; je lze vytvořit pouze jako základní třída instance, odvozené třídy.(Použití jiných programovacích jazycích jako C++ a C#, termín abstraktní třída popsat takové třídy.)

Přepsání vlastnosti a metody v odvozené třídy

Standardně odvozené třídy dědí vlastnosti a metody jeho základní třídy.Pokud zděděné vlastnosti nebo metody v odvozené třídě chovají jinak může být přepsána.Můžete definovat nové implementace metody v odvozené třídě.Následující modifikátory slouží k řízení, jak přepsat vlastnosti a metody:

  • Overridable– Umožňuje vlastnost nebo metodu třídy má být přepsán v odvozené třídě.

  • Overrides– Přepíše Overridable vlastnost nebo metoda definovaná v základní třídě.

  • NotOverridable– Zabrání vlastnost nebo metoda přepsání zděděných třídy.Ve výchozím nastavení Public metody NotOverridable.

  • MustOverride– Vyžaduje, aby odvozené třídy potlačit vlastnost nebo metodu.Když MustOverride se používá klíčové slovo, definice metody se skládá z právě na Sub, Function, nebo Property prohlášení.Jsou povoleny žádné další příkazy a konkrétně není žádná End Sub nebo End Function prohlášení.MustOverridemetody musí být deklarována v MustInherit tříd.

Předpokládejme, že chcete definovat třídy pro zpracování mezd.Můžete definovat obecný Payroll třídy, která obsahuje RunPayroll metoda výpočtu mezd typické týden.Nelze použít Payroll jako základní třída pro další specializované BonusPayroll třídy, která mohla být použita při distribuci zaměstnance bonusy.

BonusPayroll Třída dědí a přepsat, PayEmployee metodou definovanou v základní Payroll třídy.

Následující příklad definuje základní třídy Payroll, a odvozené třídy BonusPayroll, které přepíše zděděné metody, PayEmployee.Proceduře RunPayroll, vytvoří a předá Payroll objektu a BonusPayroll objekt funkce, Pay, provede PayEmployee metoda obou objektů.

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

Klíčové slovo MyBase

MyBase Klíčové slovo se chová jako proměnná objektu, který odkazuje na základní třída aktuální instance třídy.MyBasečasto se používá k přístupu členy základní třídy, které jsou přepsána nebo stínovaný v odvozené třídě.Zejména MyBase.New se používá k explicitně volat konstruktor základní třídy z konstruktoru odvozené třídy.

Předpokládejme například, že navrhujete odvozené třídy, která potlačí metodu zděděna ze základní třídy.Potlačená metoda může volat metodu v základní třídě a vrácenou hodnotu změnit, jak ukazuje následující fragment kódu:

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

Následující seznam popisuje omezení v používání MyBase:

  • MyBaseodkazuje na okamžité základní třídy a jeho zděděné členy.Nelze použít pro přístup k Private členy třídy.

  • MyBaseje klíčové slovo není reálného objektu.MyBasenelze přiřazena proměnné, předán postupy nebo v Is srovnání.

  • Metoda, MyBase kvalifikuje nemá být definována v bezprostřední základní třídy místo toho může být definován nepřímo zděděné základní třídy.Referenční kvalifikací, aby MyBase kompilace správně, musí obsahovat některé základní třídy odpovídající název a typy parametrů, které se zobrazují ve volání metody.

  • Nelze použít MyBase volání MustOverride základní metody třídy.

  • MyBasenelze použít sám nárok.Proto nejsou platné následující kód:

    MyBase.MyBase.BtnOK_Click()

  • MyBasenelze použít v modulech.

  • MyBasenelze použít pro přístup k základní třídě členy, které jsou označeny jako Friend -li základní třídy v různých sestavení.

Jiný příklad a další informace naleznete v Postupy: Přístup k proměnné skryté odvozenou třídou (Visual Basic).

Klíčové slovo MyClass

MyClass Klíčové slovo chová objektové proměnné odkazující na aktuální instance třídy implementovány jako původně.MyClassse podobá Me, ale každá metoda a vlastnost volat na MyClass se zachází jako kdyby byla metoda nebo vlastnost NotOverridable (Visual Basic).Proto metoda nebo vlastnost neovlivní přepsáním v odvozené třídě.

  • MyClassje klíčové slovo není reálného objektu.MyClassnelze přiřazena proměnné, předán postupy nebo v Is srovnání.

  • MyClassoznačuje třídy obsahující a jeho zděděné členy.

  • MyClassmůže být použit jako kvalifikátor pro Shared členů.

  • MyClassnelze použít uvnitř Shared metoda, ale lze je použít pro přístup k sdíleným člen třídy uvnitř metody instance.

  • MyClassnelze použít ve standardních modulech.

  • MyClasslze použít metodu, která je definována v základní třídě a žádná implementace metody třídy, který má nárok.Odkaz má stejný význam jako MyBase.metody.

Následující příklad porovnává Me 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

Přestože derivedClass přepíše testMethod, MyClass klíčové slovo v useMyClass nichž účinky přepsání a odstraňuje kompilátor volání verzi základní třídy testMethod.

Viz také

Referenční dokumentace

Inherits – příkaz

Koncepty

Me, My, MyBase a MyClass v jazyce Visual Basic