Stínový provoz v jazyce Visual Basic
Když dvě programovací prvky sdílejí stejný název, můžete skrýt jeden z nich, nebo stín, jiný.V takové situaci stínovaný prvek není k dispozici pro referenci; místo, když v kódu používá název prvku Visual Basic kompilátor je řeší stínového provozu prvku.
Účel
Stínový provoz hlavním účelem je chránit definice členové vaší třídy.Základní třídy mohou podstoupit změnu, která vytvoří element se stejným názvem jako jeden, který je již definován.V tomto případě Shadows modifikátor silami odkazuje prostřednictvím třídy být vyřešen členu definovaného, namísto nového prvku základní třídy.
Typy stínování
Prvek lze stínové kopie jiného prvku dvěma různými způsoby.Prvek stínového provozu může být deklarována uvnitř podoblasti oblasti obsahující stínovaný prvek, ve kterém je prováděno zastínění případě prostřednictvím oboru.Nebo deriving třídy předefinovat člen základní třídy, ve které se provádí stínování případ prostřednictvím dědičnosti.
Stínový provoz přes oboru
Je možné pro programování prvků stejný modul, třídy nebo struktury, které mají stejný název, ale jiný obor.Tímto způsobem jsou deklarovány dva prvky a kód odkazuje název sdílení, prvek s užší rozsah stínů jiného prvku (rozsah blok je nejužším).
Například můžete definovat modul Public proměnné pojmenované temp, a také s názvem místní proměnné deklarovat postup v rámci modulu temp.Odkazy na temp v rámci postupu přístup místní proměnné a odkazy na temp z mimo řízení přístupu Public proměnné.V tomto případě postup proměnné temp stínů proměnná modulu temp.
Následující obrázek znázorňuje dvě proměnné, oba s názvem temp.Lokální proměnná temp stínů členské proměnné temp při dostupný v jeho vlastní postup p.Však MyClass klíčové slovo obchází stínování a přistupuje k členské proměnné.
Stínový provoz přes oboru
Příkladem stínový provoz přes oboru naleznete v Postup: skrytí proměnné se stejným názvem jako proměnné (Visual Basic).
Stínový provoz prostřednictvím dědičnosti
Pokud odvozené třídy předefinuje programovací element dědí ze základní třídy, redefining prvek stínů původního prvku.Libovolný typ prvku prohlášené nebo sady prvků přetížené můžete stín s jiným typem.Například Integer proměnné lze stínu Function postup.Vytvořit stínovou kopii postup s jiným postupem můžete seznam různých parametrů a jiný typ vrácené hodnoty.
Následující obrázek znázorňuje základní třídy b a odvozené třídy d , dědí z b.Základní třída definuje proceduru s názvem proc, a odvozené třídy je stínů s jiným postupem se stejným názvem.První Call prohlášení přistupuje stínování proc v odvozené třídě.Však MyBase klíčové slovo obchází stínování a přistupuje k stínovaný postupu v základní třídě.
Stínový provoz prostřednictvím dědičnosti
Příklad stínový prostřednictvím dědičnosti, viz Postup: skrytí proměnné se stejným názvem jako proměnné (Visual Basic) a Postup: skrytí zděděné proměnné (Visual Basic).
Stínování a úroveň přístupu
Prvek stínového provozu není vždy přístupné z kódu pomocí odvozené třídy.Například může být deklarován Private.V takovém případě stínový provoz je defeated a kompilátor řeší jakýkoli odkaz na stejný prvek by mělo Pokud byla bez stínování.Tento prvek je přístupné prvek derivational nejmenším počtem kroky zpět ze stínového provozu třídy.Pokud prvek stínovaný postup, rozlišení je nejbližší dostupné verze se stejným názvem seznam parametrů a vracet typ.
Následující příklad ukazuje hierarchii dědičnosti, třech tříd.Každá třída definuje Sub postup display, a všechny odvozené třídy stíny display postupu v její základní třídě.
Public Class firstClass
Public Sub display()
MsgBox("This is firstClass")
End Sub
End Class
Public Class secondClass
Inherits firstClass
Private Shadows Sub display()
MsgBox("This is secondClass")
End Sub
End Class
Public Class thirdClass
Inherits secondClass
Public Shadows Sub display()
MsgBox("This is thirdClass")
End Sub
End Class
Module callDisplay
Dim first As New firstClass
Dim second As New secondClass
Dim third As New thirdClass
Public Sub callDisplayProcedures()
' The following statement displays "This is firstClass".
first.display()
' The following statement displays "This is firstClass".
second.display()
' The following statement displays "This is thirdClass".
third.display()
End Sub
End Module
V předchozím příkladu odvozené třídy secondClass stíny display se Private postup.Když modul callDisplay volání display v secondClass, je volající kód mimo secondClass a proto nelze získat přístup k soukromé display postup.Stínový provoz je defeated a kompilátor řeší odkaz na základní třídy display postup.
Však další odvozené třídy thirdClass prohlašuje display jako Public, takže kód v callDisplay k němu přístup.
Stínování a přepsání
Nezaměňujte stínový provoz s přepsání.Obě jsou používány odvozená třída dědí ze základní třídy a i jeden element deklarovaný jiným předefinovat.Ale existují významné rozdíly mezi nimi.Pro porovnání, viz Rozdíly mezi stínování a přepsání (Visual Basic).
Stínování a přetížení
Pokud jste v odvozené třídě stínové kopie téhož prvku základní třídy s více než jeden prvek, stanou stínového provozu prvky přetížených verzí prvku.Další informace naleznete v tématu Řízení přetížení (Visual Basic).
Přístup k prvku na stínovaný
Při přístupu k prvku z odvozené třídy obvykle provedete pomocí aktuální instance dané třídy odvozené kvalifikováním názvu prvku s Me klíčové slovo.Pokud odvozené třídy stínů prvku základní třídy, můžete získat přístup prvku základní třídy s nárokem MyBase klíčové slovo.
Příklad přístupu k prvku na stínovaný, viz Jak: přístup k proměnné skryté odvozené třídy (Visual Basic).
Deklarace proměnné objektu
Jak vytvořit proměnné objektu může také ovlivnit, zda odvozené třídy přistupuje stínového provozu prvku nebo stínovaný prvku.Následující příklad vytvoří dva objekty z odvozené třídy, ale jeden objekt je deklarován jako základní třída a druhý jako odvozené třídy.
Public Class baseCls
' The following statement declares the element that is to be shadowed.
Public z As Integer = 100
End Class
Public Class dervCls
Inherits baseCls
' The following statement declares the shadowing element.
Public Shadows z As String = "*"
End Class
Public Class useClasses
' The following statement creates the object declared as the base class.
Dim basObj As baseCls = New dervCls()
' Note that dervCls widens to its base class baseCls.
' The following statement creates the object declared as the derived class.
Dim derObj As dervCls = New dervCls()
Public Sub showZ()
' The following statement outputs 100 (the shadowed element).
MsgBox("Accessed through base class: " & basObj.z)
' The following statement outputs "*" (the shadowing element).
MsgBox("Accessed through derived class: " & derObj.z)
End Sub
End Class
V předchozím příkladu proměnné basObj je deklarována jako základní třída.Přiřazení dervCls objektu představuje rozšiřujícího převodu a proto je platný.Základní třída nemůže přístup však stínového provozu verze proměnné z v odvozené třídě tak, aby kompilátor řeší basObj.z na původní hodnotu základní třídy.
Viz také
Referenční dokumentace
Koncepty
Odkazy na prvky deklarované (Visual Basic)
Rozšiřování a zužující převody (Visual Basic)