2010-11-29 28 views
2

このpostによれば、以下のコードはコンパイルする必要がありますが、コンパイルする必要はありません。VB.NETで保護されたメンバーにアクセスする

class Base 
    protected m_x as integer 
end class 

class Derived1 
    inherits Base 
    public sub Foo(other as Base) 
     other.m_x = 2 
    end sub 
end class 

class Derived2 
    inherits Base 
end class 

何が問題なのですか?私はちょうど新しいVB.NETコンソールプロジェクトを作成し、コードをコピーして貼り付けました。

「SampleProject.Base.m_x」は「保護されている」ため、このコンテキストではアクセスできません。異なる.NETフレームワークバージョン(2.0,3.0,3.5)でチェックしました。

+0

Foo()をBaseクラスに移動します。 –

答えて

3

保護されたメンバーは、MyBase.m_x(C#のベース)を介して派生クラスからのみアクセスできます。 あなたが書くことができます:

public sub Foo(other as Base) 
    MyBase.m_x = 2 
end sub 

other.m_x = 2がコンパイルされない理由は、ありますDerived1の現在のインスタンスの基本クラスのインスタンス(または必ずしもそうである必要はありません)。これはパラメータ値であるため、Baseのインスタンスになる可能性があります。

2

は、のベースクラスのインスタンスの変数ではなく、継承された変数にアクセスできます。

class Base 
    protected m_x as integer 
end class 

class Derived1 
    inherits Base 
    public sub Foo(other as Base) 
     MyBase.m_x = 2 ' OK - Access inherited member 
     other.m_x = 2 ' NOT OK - attempt to access a protected field from another instance 
    end sub 
end class 
+0

これは技術的には正しくありません。両方が型Derived1の場合、両方の保護されたメンバーにアクセスできます。問題は、彼が合法ではない基底型を使用していることです( 'other'は' Derived1'と関係のない 'Derived42'のようなものかもしれません)。 –

+0

@Justin - 私が基本クラスのインスタンスについて話していることを明確にしました。 – Oded

0

保護されたメンバーの重要な側面は、継承された保護されたメンバーに、その祖先以外のクラスからのアクセスを効果的に遮断することができることです(クラスが親のメソッド/プロパティをオーバーライドし、クラスにアクセスすることはできませんが、階層の余分なレイヤーを追加することなくこれを行う方法はありません)。たとえば、クローニングをサポートするクラスですが、そうでないクラスのための有用な基本クラスである可能性があり、Protected "Clone"メソッドを持つ可能性があります。クローンをサポートしていないサブクラスは、親クローンメソッドをシャドウする "Clone"という名前のネストされたクラスを作成することで、自分自身のサブクラスがクローンを呼び出すのを防ぐことができます。

オブジェクトが継承チェーンの他の場所で保護されたメンバーにアクセスできる場合、この「保護された」側面はもはや適用されません。

関連する問題