方法: 自分で宣言した変数と同じ名前の変数を隠す (Visual Basic)
シャドウすることで、変数を隠すことができます。シャドウとは、同じ名前の変数を使用して、変数を再定義することです。 以下のいずれかの方法で、隠す変数をシャドウできます。
スコープによるシャドウ。 隠す変数が含まれる領域のサブ領域内で再宣言することにより、スコープによるシャドウを行うことができます。
継承によるシャドウ。 隠す変数がクラス レベルで定義されている場合、派生クラスで Shadows (Visual Basic) キーワードを使用して再宣言することにより、継承によるシャドウを行うことができます。
変数を隠す 2 つの方法
スコープによるシャドウを行って、変数を隠すには
隠す変数を定義する領域を決め、変数を使用して再定義するサブ領域を決めます。
変数の領域
再定義が許可されたサブ領域
モジュール
モジュール内のクラス
クラス
クラス内のサブクラス
クラス内のプロシージャ
たとえば、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
上の例では、モジュール レベルおよびプロシージャ レベル (プロシージャ show 内) の両方で、num 変数が宣言されています。 show 内では、ローカル変数 num がモジュール レベルの変数 num をシャドウします。したがって、ローカル変数が 2 に設定されます。 一方、useModuleLevelNum プロシージャ内の num をシャドウするローカル変数はありません。 したがって、useModuleLevelNum によって、モジュール レベルの変数の値が 1 に設定されます。
show 内部の MsgBox 呼び出しは、モジュール名を使用して num を修飾することにより、シャドウ機構を使用しないようにします。 したがって、ローカル変数ではなく、モジュール レベルの変数が表示されます。
継承によるシャドウを行って、変数を隠すには
隠す変数が、クラスおよびクラス レベル (プロシージャの外部) で宣言されているようにします。 そうしないと、継承によるシャドウを行うことができません。
変数のクラスから派生したクラスが既に存在しない場合、定義します。
派生クラスの内部で、変数を宣言する Dim ステートメントを記述します。 宣言には Shadows (Visual Basic) キーワードを含めます。
派生クラスのコードによって変数名が参照されているとき、変数への参照をコンパイラが解決します。
継承によるシャドウの例を次に示します。 これにより 2 つの参照が作成されます。1 つはシャドウ変数にアクセスする参照、もう 1 つはシャドウを使用しない参照です。
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 変数を宣言し、派生クラスでシャドウしています。 名前 shadowString が修飾されていない場合、派生クラスの showStrings プロシージャには、文字列のシャドウ バージョンが表示されます。 次に、shadowString が MyBase キーワードで修飾されている場合には、シャドウされたバージョンが表示されます。
信頼性の高いプログラミング
シャドウでは、同じ名前の複数のバージョンの変数を取り入れます。 コード ステートメントによって変数名が参照されているとき、コンパイラによって参照が解決されるバージョンは、コード ステートメントの位置および修飾する文字列の存在などの要因に依存しています。 これにより、意図しないバージョンのシャドウされた変数を参照するリスクが増加する可能性があります。 シャドウされた変数へのすべての参照を完全修飾することによって、このリスクを低減させることができます。
参照
処理手順
方法: 派生クラスによって非表示になっている変数にアクセスする (Visual Basic)
参照
概念
シャドウとオーバーライドの違い (Visual Basic)
Visual Basic における Me、My、MyBase、MyClass