Hiding Variable
You can hide a variable sources code by shadowing it, that is, by redefining it with a variable of the same sources code name. You can shadow the variable you want to hide in two ways:
• Shadowing Through Scope. You can shadow it through scope by redeclaring it inside a subregion of the region containing the variable you want to hide.
• Shadowing Through Inheritance. If the variable you want to hide is defined at class level, you can shadow it through inheritance by redeclaring it with the Shadows keyword in a derived class.
Two Ways to Hide a Variable
To hide a variable by shadowing it through scope
1. Determine the region defining the variable you want to hide, and determine a subregion in which to redefine it with your variable.
Variable's region Allowable subregion for redefining it
Module A class within the module
Class A subclass within the class
A procedure within the class
2. You cannot redefine a procedure in a block within that procedure, for example in an If...End If construction or a For loop.
3. Create the subregion if it does not already exist.
4. Within the subregion, write a Dim(statement - Visual Basic) declaring the shadowing when code inside the subregion refers to the variable name, the compiler resolves the variable reference to the shadowing variable The following example illustrates shadowing through scope, as well as a reference that bypasses the shadowing.
sources code :
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
The preceding example declares the variable num both at module level and at procedure level (in the procedure show). The local variable num shadows the module-level variable num within show, so the local variable is set to 2. However, there is no local variable to shadow num in the useModuleLevelNum procedure. Therefore, useModuleLevelNum sets the value of the module-level variable to 1.
The MsgBox call inside show bypasses the shadowing mechanism by qualifying num with the module name. Therefore, it displays the module-level variable instead of the local variable.
To hide a variable by shadowing it through inheritance
1. Be sure the variable you want to hide is declared in a class, and at class level (outside any procedure). Otherwise you cannot shadow it through inheritance.
2. Define a class derived from the variable's class if one does not already exist.
3. Inside the derived class, write a Dim statement declaring your variable. Include the Shadows keyword in the declaration.
When code in the derived class refers to the variable name, the compiler resolves the reference to your variable.
The following example illustrates shadowing through inheritance. It makes two references, one that accesses the shadowing variable and one that bypasses the shadowing.
sources code :
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
The preceding example declares the variable shadowString in the base class and shadows it in the derived class. The procedure showStrings in the derived class displays the shadowing version of the string when the name shadowString is not qualified. It then displays the shadowed version when shadowString is qualified with the MyBase keyword.