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.
Zmienną można ukryć, cieniując ją, czyli przez ponowne zdefiniowanie jej za pomocą zmiennej o tej samej nazwie. Zmienną, którą chcesz ukryć, można ukryć na dwa sposoby:
Cieniowanie w kontekście zakresu. Można przesłonić zmienną w zakresie, ponownie deklarując ją w podregionie regionu, który zawiera zmienną, którą chcesz ukryć.
Cieniowanie przez dziedziczenie. Jeśli zmienna, którą chcesz ukryć, jest zdefiniowana na poziomie klasy, można ją zaciemnić przez dziedziczenie, ponownie deklarując je za pomocą słowa kluczowego Shadows w klasie pochodnej.
Dwa sposoby ukrywania zmiennej
Aby ukryć zmienną poprzez zasłonięcie jej w obrębie zakresu.
Określ region definiujący zmienną, którą chcesz ukryć, i określ podregion, w którym należy ponownie zdefiniować zmienną.
Region zmiennej Dozwolony podregion do ponownego zdefiniowania go Moduł Klasa w module Klasa Podklasa w klasie
Procedura w klasieNie można ponownie zdefiniować zmiennej procedury w bloku w ramach tej procedury, na przykład w konstrukcji
If...End Iflub w pętliFor.Utwórz podregion, jeśli jeszcze nie istnieje.
W podregionie napisz instrukcję Dim deklarując zmienną cieniowania.
Gdy kod wewnątrz podregionu odwołuje się do nazwy zmiennej, kompilator rozpoznaje odwołanie do zmiennej cieniowania.
Poniższy przykład ilustruje cieniowanie w obrębie zakresu, a także referencję, która omija to cieniowanie.
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 ModulePowyższy przykład deklaruje zmienną
numzarówno na poziomie modułu, jak i na poziomie procedury (w procedurzeshow). Zmienna lokalnanumprzesłania zmienną na poziomie modułunumw obrębieshow, więc zmienna lokalna jest ustawiona na 2. Jednak w procedurze nie ma zmiennej lokalnej do cienianumuseModuleLevelNum.useModuleLevelNumW związku z tym ustawia wartość zmiennej na poziomie modułu na 1.Wywołanie
MsgBoxw ramachshowomija mechanizm cieniowania, kwalifikującnumprzez nazwę modułu. W związku z tym wyświetla zmienną na poziomie modułu zamiast zmiennej lokalnej.
Aby ukryć zmienną, cieniując ją przez dziedziczenie
Upewnij się, że zmienna, którą chcesz ukryć, jest zadeklarowana w klasie i na poziomie klasy (poza dowolną procedurą). W przeciwnym razie nie można go zaciemnić za pośrednictwem dziedziczenia.
Zdefiniuj klasę pochodzącą z klasy zmiennej, jeśli jeszcze nie istnieje.
Wewnątrz klasy pochodnej napisz instrukcję deklarując zmienną
Dim. Dołącz słowo kluczowe Shadows do deklaracji .Gdy kod w klasie pochodnej odwołuje się do nazwy zmiennej, kompilator rozpoznaje odwołanie do zmiennej.
Poniższy przykład ilustruje cieniowanie przez dziedziczenie. Tworzy dwa odwołania, jedno, które uzyskuje dostęp do zmiennej przesłaniającej i jedno, które pomija przesłanianie.
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 ClassPowyższy przykład deklaruje zmienną
shadowStringw klasie bazowej i cieniuje ją w klasie pochodnej. ProcedurashowStringsw klasie pochodnej wyświetla wersję cienującą tego ciągu, gdy nazwashadowStringnie jest w pełni określona. Następnie wyświetla zacienioną wersję, gdyshadowStringjest kwalifikowany za pomocą słowa kluczowegoMyBase.
Niezawodne programowanie
Funkcja cieniowania wprowadza więcej niż jedną wersję zmiennej o tej samej nazwie. Gdy instrukcja kodu odwołuje się do nazwy zmiennej, wersja, do której kompilator rozpoznaje odwołanie, zależy od czynników, takich jak lokalizacja instrukcji kodu i obecność ciągu kwalifikującego. Może to zwiększyć ryzyko odwoływania się do niezamierzonej wersji przysłoniętej zmiennej. Ryzyko to można zmniejszyć, poprzez pełne kwalifikowanie wszystkich odwołań do przesłoniętej zmiennej.