Поделиться через


Практическое руководство. Сокрытие переменной с тем же именем, что и ваша переменная

Обновлен: Ноябрь 2007

Cкрыть переменную можно затенением, то есть переопределением переменной с тем же именем. Затенить переменную, которую требуется скрыть, можно двумя способами:

  • Затенение через область действия. Можно затенить переменную в области действия путем переопределения ее внутри вложенного блока, внешний блок которого содержит переменную, которую требуется скрыть.

  • Затенение через наследование. Если переменная, которую требуется скрыть, определена на уровне класса, то ее можно затенить через наследование путем ее переопределения с помощью ключевого слова Shadows в производном классе.

Два способа сокрытия переменной

Чтобы скрыть переменную с помощью затенения в области действия, выполните следующие действия:

  1. Определите область действия переменной, которую требуется скрыть, и подобласть, в которой будет производиться переопределение переменной.

    Область действия переменной

    Допустимые подобласти для ее переопределения

    Модуль

    Класс в модуле

    Класс

    Подкласс внутри класса

    Процедура внутри класса

    Нельзя переопределить переменную процедуры в блоке, находящемся внутри этой процедуры, например, в конструкции If...End If или в цикле For.

  2. Создайте подобласть, если она еще не существует.

  3. В пределах подобласти напишите оператор Оператор 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 с помощью имени модуля. Поэтому в нем отображается переменная уровня модуля, а не локальная переменная.

Чтобы скрыть переменную с помощью наследования, выполните следующие действия:

  1. Убедитесь, что переменная, которую требуется скрыть, объявлена в классе и на уровне класса (вне всех процедур). В противном случае скрыть ее через наследование нельзя.

  2. Определите класс, производный от класса переменной, если такой еще не существует.

  3. Внутри производного класса напишите оператор 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.

Отказоустойчивость

Затенение позволяет давать одно и то же имя нескольким переменным. Если оператор в коде ссылается на имя переменной, то версия переменной, с помощью которой компилятор разрешает ссылку, зависит от таких факторов, как расположение оператора и наличие строки квалификации. Это может повысить риск обращения к непредусмотренной версии затеняемой переменной. Снизить этот риск можно путем полной квалификации всех обращений к затеняемой переменной.

См. также

Задачи

Практическое руководство. Различение двух элементов с одинаковыми именами

Практическое руководство. Сокрытие наследуемой переменной

Практическое руководство. Доступ к переменной, скрытой производным классом

Основные понятия

Разрешение ссылки, когда несколько переменных имеют одинаковые имена

Сокрытие в Visual Basic

Различия между сокрытием и переопределением

Ссылки

Overrides

MyBase

Другие ресурсы

Ссылки на объявленные элементы