Практическое руководство. Сокрытие переменной с тем же именем, что и ваша переменная (Visual Basic)
Cкрыть переменную можно затенением, то есть переопределением переменной с тем же именем. Затенить переменную, которую требуется скрыть, можно двумя способами:
Затенение через область действия. Можно затенить переменную в области действия путем переопределения ее внутри вложенного блока, внешний блок которого содержит переменную, которую требуется скрыть.
Затенение через наследование. Если переменная, которую требуется скрыть, определена на уровне класса, то ее можно затенить через наследование путем ее переопределения с помощью ключевого слова Shadows (Visual Basic) в производном классе.
Два способа сокрытия переменной
Чтобы скрыть переменную с помощью затенения в области действия, выполните следующие действия:
Определите область действия переменной, которую требуется скрыть, и подобласть, в которой будет производиться переопределение переменной.
Область действия переменной
Допустимые подобласти для ее переопределения
Модуль
Класс в модуле
Класс
Подкласс внутри класса
Процедура внутри класса
Нельзя переопределить переменную процедуры в блоке, находящемся внутри этой процедуры, например, в конструкции If...End If или в цикле For.
Создайте подобласть, если она еще не существует.
В пределах подобласти напишите оператор Оператор Dim (Visual Basic), объявляющий затеняемую переменную.
Когда код внутри подобласти ссылается на имя переменной, компилятор разрешает ссылку с помощью затеняющей переменной.
В следующем примере показано затенение через область действия, а также обращение, обходящее затенение.
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 (Visual Basic).
Если код в производном классе ссылается на имя переменной, компилятор разрешает ссылку с помощью созданной таким образом переменной.
В следующем примере показано затенение через наследование. Производятся два обращения: одно — к затеняющей переменной, другое же обходит затенение.
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.
Отказоустойчивость
Затенение позволяет давать одно и то же имя нескольким переменным. Если оператор в коде ссылается на имя переменной, то версия переменной, с помощью которой компилятор разрешает ссылку, зависит от таких факторов, как расположение оператора и наличие строки квалификации. Это может повысить риск обращения к непредусмотренной версии затеняемой переменной. Снизить этот риск можно путем полной квалификации всех обращений к затеняемой переменной.
См. также
Задачи
Практическое руководство. Сокрытие наследуемой переменной (Visual Basic)
Практическое руководство. Доступ к переменной, скрытой производным классом (Visual Basic)
Ссылки
Основные понятия
Различия между сокрытием и переопределением (Visual Basic)
Me, My, MyBase и MyClass в Visual Basic
Основы наследования (Visual Basic)