派生クラスのコードが変数にアクセスすると、コンパイラは通常、最も近いアクセス可能なバージョンへの参照を解決します。つまり、アクセス可能なバージョンは、アクセスするクラスからの派生ステップが最も少なくなります。 変数が派生クラスで定義されている場合、コードは通常、その定義にアクセスします。
派生クラス変数が基底クラスの変数をシャドウする場合、基底クラスのバージョンは非表示になります。 ただし、基底クラス変数には、 MyBase
キーワードで修飾することでアクセスできます。
派生クラスによって非表示になっている基底クラス変数にアクセスするには
式または代入ステートメントで、変数名の前に
MyBase
キーワードとピリオド (.
) を付けます。コンパイラは、変数の基底クラス バージョンへの参照を解決します。
次の例は、継承によるシャドウを示しています。 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
を宣言し、それを派生クラスでシャドウします。 派生クラスでshowStrings
プロシージャは、名前shadowString
が修飾されていない場合に、文字列のシャドウ バージョンを表示します。 その後、shadowString
がMyBase
キーワードで修飾されると、シャドウされたバージョンが表示されます。
堅牢なプログラミング
シャドウされた変数の意図しないバージョンを参照するリスクを減らすために、シャドウされた変数へのすべての参照を完全に修飾できます。 シャドウ処理では、同じ名前の変数の複数のバージョンが導入されます。 コード ステートメントが変数名を参照する場合、コンパイラが参照を解決するバージョンは、コード ステートメントの場所や修飾文字列の存在などの要因によって異なります。 これにより、間違ったバージョンの変数を参照するリスクが高くなる可能性があります。
こちらも参照ください
.NET