Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Proměnnou můžete skrýt tak, že ji stíníte . To znamená, že ji znovu nadefinujete s proměnnou se stejným názvem. Proměnnou, kterou chcete skrýt, můžete stínovat dvěma způsoby:
Stínování v rámci oboru působnosti Můžete ho překrýt v rámci oboru tím, že ho znovu deklarujete v podregionu oblasti, která obsahuje proměnnou, kterou chcete skrýt.
Stínování prostřednictvím dědičnosti Pokud je proměnná, kterou chcete skrýt, definována na úrovni třídy, můžete ji stínovat prostřednictvím dědičnosti tím, že ji předefinujete pomocí klíčového slova Shadows v odvozené třídě.
Dva způsoby skrytí proměnné
Skrytí proměnné jejím stínováním v rámci oboru
Určete oblast definující proměnnou, kterou chcete skrýt, a určete podoblast, ve které chcete předefinovat proměnnou.
Oblast proměnné Povolená podoblast pro jeho předefinování Modul Třída v rámci modulu Třída Podtřída v rámci třídy
Procedura v rámci třídyProcedurální proměnnou nelze v bloku v rámci této procedury předefinovat, například v
Ifkonstrukci ...End Ifnebo ve smyčceFor.Vytvořte podoblast, pokud ještě neexistuje.
V podregionu napište příkaz Dim deklarující proměnnou stínování.
Když kód uvnitř podregionu odkazuje na název proměnné, kompilátor přeloží odkaz na stínovací proměnnou.
Následující příklad znázorňuje stínování v rámci oboru a také referenci, která obchází stínování.
Module shadowByScope ' The following statement declares num as a module-level variable. Public num As Integer Sub show() ' The following statement declares num as a local variable. Dim num As Integer ' The following statement sets the value of the local variable. num = 2 ' The following statement displays the module-level variable. MsgBox(CStr(shadowByScope.num)) End Sub Sub useModuleLevelNum() ' The following statement sets the value of the module-level variable. num = 1 show() End Sub End ModulePředchozí příklad deklaruje proměnnou
numna úrovni modulu i na úrovni procedury (v postupushow). Místní proměnnánumstínuje proměnnounumna úrovni modulu v rámcishow, takže místní proměnná je nastavená na hodnotu 2. V proceduře však neexistuje žádná místní proměnná pro zastíněnínum.useModuleLevelNumProto nastaví hodnotu proměnné na úrovni modulu na 1.Volání
MsgBoxuvnitřshowobchází mechanismus stínování tím, že se kvalifikujenums názvem modulu. Proto místo místní proměnné zobrazí proměnnou na úrovni modulu.
Skrytí proměnné stínováním prostřednictvím dědičnosti
Ujistěte se, že proměnná, kterou chcete skrýt, je deklarována ve třídě a na úrovni třídy (mimo jakoukoli proceduru). Jinak ho nemůžete stínovat prostřednictvím dědičnosti.
Definujte třídu odvozenou z třídy proměnné, pokud ještě neexistuje.
Uvnitř odvozené třídy napište
Dimpříkaz deklarující proměnnou. Do deklarace zahrňte klíčové slovo Shadows .Pokud kód v odvozené třídě odkazuje na název proměnné, kompilátor přeloží odkaz na vaši proměnnou.
Následující příklad znázorňuje stínování prostřednictvím dědičnosti. Vytváří dva odkazy: jeden, který přistupuje ke stínované proměnné, a druhý, který obchází zakrývání proměnné.
Public Class shadowBaseClass Public shadowString As String = "This is the base class string." End Class Public Class shadowDerivedClass Inherits shadowBaseClass Public Shadows shadowString As String = "This is the derived class string." Public Sub showStrings() Dim s As String = "Unqualified shadowString: " & shadowString & vbCrLf & "MyBase.shadowString: " & MyBase.shadowString MsgBox(s) End Sub End ClassPředchozí příklad deklaruje proměnnou
shadowStringv základní třídě a stínuje ji v odvozené třídě. ProcedurashowStringsv odvozené třídě zobrazí stínovací verzi řetězce, pokud názevshadowStringnení kvalifikovaný. Potom zobrazí stínovou verzi, pokudshadowStringje kvalifikována pomocí klíčovéhoMyBaseslova.
Robustní programování
Stínování zavádí více než jednu verzi proměnné se stejným názvem. Pokud příkaz kódu odkazuje na název proměnné, verze, na kterou kompilátor přeloží odkaz, závisí na faktorech, jako je umístění příkazu kódu a přítomnost opravňujícího řetězce. To může zvýšit riziko odkazování na nezamýšlenou verzi stínované proměnné. Toto riziko můžete snížit tím, že plně specifikujete všechny reference na stínovanou proměnnou.