Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Можно скрыть переменную, затенив ее, то есть переопредеив ее с переменной того же имени. Вы можете скрыть переменную двумя способами:
Наблюдение через призму. Вы можете затенить его в рамках области видимости, повторно объявив его внутри подобласти области, содержащей переменную, которую вы хотите скрыть.
Теневое наследование. Если переменная, которую требуется скрыть, определяется на уровне класса, вы можете затенить ее путем наследования, переобъявив ее ключевым словом Shadows в производном классе.
Два способа скрыть переменную
Скрыть переменную, используя более узкую область видимости, где она перекрывается другой переменной.
Определите регион, определяющий переменную, которую вы хотите скрыть, и определите область, в которой необходимо переопределить ее с помощью переменной.
Регион переменной Допустимый подрегион для переопределения Модуль Класс в модуле Класс Подкласс в классе
Процедура в классеНевозможно переопределить переменную процедуры в блоке внутри этой процедуры, например, в конструкции
If
...End If
или в циклеFor
.Создайте этот регион, если он еще не существует.
В пределах подобласти напишите оператор Dim, объявляющий переменную, перекрывающую другую.
Когда код внутри подобласти ссылается на имя переменной, компилятор разрешает ссылку на затеняющую переменную.
В следующем примере показано теневое прикрытие в пределах области действия, а также ссылка, которая обходит теневое прикрытие.
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 Module
В предыдущем примере переменная
num
объявляется как на уровне модуля, так и на уровне процедуры (в процедуреshow
). Локальная переменнаяnum
затмевает переменнуюnum
уровня модуля внутриshow
, поэтому для локальной переменной задано значение 2. Однако в процедуреnum
отсутствует локальная переменная, чтобы затенятьuseModuleLevelNum
.useModuleLevelNum
Поэтому задает значение переменной уровня модуля значение 1.Вызов
MsgBox
внутриshow
обходит механизм теней, указывая имя модуля дляnum
. Поэтому она отображает переменную уровня модуля вместо локальной переменной.
Скрытие переменной путем затенения через наследование
Убедитесь, что переменная, которую вы хотите скрыть, объявлена в классе и на уровне класса (вне любой процедуры). В противном случае вы не можете затенить его через наследование.
Определите класс, производный от класса переменной, если он еще не существует.
В производном классе напишите инструкцию
Dim
, объявляющую вашу переменную. Включите ключевое слово Shadows в объявление.Если код в производном классе ссылается на имя переменной, компилятор разрешает ссылку на вашу переменную.
В следующем примере показано затенение посредством наследования. Он делает две ссылки: одна из них обращается к теневой переменной, а другая обходит затенение.
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 Class
В предыдущем примере переменная
shadowString
объявляется в базовом классе и переопределяется в производном классе.showStrings
Процедура в производном классе отображает версию теневой строки, если имяshadowString
не указано. Отображается затем теневая версия, когдаshadowString
квалифицировано ключевым словомMyBase
.
Надежное программирование
Тень представляет несколько версий переменной с одинаковым именем. Если инструкция кода ссылается на имя переменной, версия, к которой компилятор разрешает эту ссылку, зависит от таких факторов, как расположение инструкции кода и наличие уточняющей строки. Это может увеличить риск обращения к непреднамеренной версии теневой переменной. Вы можете снизить этот риск, полностью квалифицируя все ссылки на теневую переменную.