基本クラス変数 [重複] を介してアクセスされる C# の保護されたメンバー
-
11-09-2019 - |
質問
この質問にはすでに答えがあります:
かなり初心者の質問のように思えるかもしれませんが、メソッド Der.B() が Base クラス変数を介して保護された Foo にアクセスできない理由を説明できますか?これは私には奇妙に思えます:
public class Base
{
protected int Foo;
}
public class Der : Base
{
private void B(Base b) { Foo = b.Foo; } // Error: Cannot access protected member
private void D(Der d) { Foo = d.Foo; } // OK
}
ありがとう!
解決
これはよく聞かれる質問です。これは違法である理由を理解するには、間違って行くことができるものについて考えます。
あなたが別の派生クラスFROBは、基地から派生していたとします。今、あなたはDer.B.にFROBのインスタンスを渡しますあなたはDer.BからFrob.Fooにアクセスできるようにすべきですか?いいえ、絶対にありません。 Frob.Fooは保護されています。それだけでFROBとFROBのサブクラスからアクセス可能でなければなりません。デアは、FROBないとFROBのサブクラスではないので、FROBの保護されたメンバーへのアクセスを得ることはありませんされています。
それははっきりしていない場合は、件名に私の記事を参照してください。
http://blogs.msdn.com/ericlippert/アーカイブ/ 2005/11月9日/ 491031.aspxする
他のヒント
Bでは、別のクラスのprotectedメンバにアクセスしようとしています。あなたがそのようなクラスから継承しているという事実は無関係です。 Dでは、あなたの現在のクラスの基底クラスのprotectedメンバにアクセスしています。この文脈では、あなたがデア、それが継承されるタイプの保護されたメンバーから何かをアクセスすることができます。
あなたは、基本クラスで静的メソッドを宣言することでこの制限を回避することができます:
public class Base
{
protected int Foo;
protected static int GetFoo(Base b)
{
return b.Foo;
}
}
public class Der : Base
{
private void B(Base b) { Foo = GetFoo(b); } // OK
}
簡単に保護され、置くサブクラスへのアクセスを可能にします。
でます:
private void B(Base b) { Foo = b.Foo; }
あなたはデアのインスタンスがアクセス権を持っていない保護されたメンバーにアクセスしようとしています。それはデア(本)のあなたの現在のインスタンスのベースクラスだった場合にのみ、それへのアクセスを持っているでしょう。
private void D(Der d) { Foo = d.Foo; } // OK
あなたはそれが法の保護基本クラスのアクセスするためにはDer通過しているので、が正常に動作します。
のシナリオでは、あなたはint型fooの「内部」を使用したいと思うでしょうしようとしている。