Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
Можно скрыть переменную, затенив ее, то есть переопредеив ее с переменной того же имени. Вы можете скрыть переменную двумя способами:
Наблюдение через призму. Вы можете затенить его в рамках области видимости, повторно объявив его внутри подобласти области, содержащей переменную, которую вы хотите скрыть.
Теневое наследование. Если переменная, которую требуется скрыть, определяется на уровне класса, вы можете затенить ее путем наследования, переобъявив ее ключевым словом 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.
Надежное программирование
Тень представляет несколько версий переменной с одинаковым именем. Если инструкция кода ссылается на имя переменной, версия, к которой компилятор разрешает эту ссылку, зависит от таких факторов, как расположение инструкции кода и наличие уточняющей строки. Это может увеличить риск обращения к непреднамеренной версии теневой переменной. Вы можете снизить этот риск, полностью квалифицируя все ссылки на теневую переменную.