11

初心者の質問のように思われるかもしれませんが、メソッド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
}

ありがとう!

4

5 に答える 5

22

これはよくある質問です。これが違法である理由を理解するために、何がうまくいかないかを考えてください。

Baseから派生した別の派生クラスFrobがあるとします。ここで、FrobのインスタンスをDer.Bに渡します。Der.BからFrob.Fooにアクセスできるようにする必要がありますか?いいえ、絶対にありません。Frob.Fooは保護されています。FrobおよびFrobのサブクラスからのみアクセス可能である必要があります。DerはFrobではなく、Frobのサブクラスでもないため、Frobの保護されたメンバーにアクセスできません。

それが明確でない場合は、このテーマに関する私の記事を参照してください。

http://blogs.msdn.com/ericlippert/archive/2005/11/09/491031.aspx

于 2009-12-03T00:42:17.043 に答える
4

Bでは、別のクラスの保護されたメンバーにアクセスしようとしています。そのクラスから継承しているという事実は関係ありません。Dでは、現在のクラスの基本クラスの保護されたメンバーにアクセスしています。このコンテキストでは、Derおよびそれが継承しているタイプの保護されたメンバーから何にでもアクセスできます。

于 2009-12-02T22:09:59.960 に答える
3

基本クラスで静的メソッドを宣言することで、この制限を回避できます。

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
}
于 2009-12-14T06:57:42.190 に答える
2

簡単に言えば、protectedはサブクラスへのアクセスを許可します。

の:

private void B(Base b) { Foo = b.Foo; }

Derのインスタンスがアクセスできない保護されたメンバーにアクセスしようとしています。それがDerの現在のインスタンス(this)の基本クラスである場合にのみアクセスできます。

private void D(Der d) { Foo = d.Foo; } // OK

Derを経由してBaseクラスの保護されたメソッドにアクセスするため、正常に機能します。

于 2009-12-02T22:14:21.040 に答える
0

あなたが試みているシナリオでは、intFooに「内部」を使用したいと思うでしょう。

于 2009-12-02T22:09:32.593 に答える