11

私は次のコードを書きました:

public class A                             
{
    protected string Howdy = "Howdy!";     
}

public class B : A                           
{
    public void CallHowdy()
    {
        A a = new A();
        Console.WriteLine(a.Howdy);
    }
}

これでVS2010、次のコンパイルエラーが発生します。

タイプ「A」の修飾子を介して保護されたメンバー「Aa」にアクセスできません。修飾子はタイプ「B」(またはそれから派生)である必要があります。

これは私には非常に非論理的です-protectedクラスのメソッドから派生したクラスインスタンスのフィールドにアクセスできないのはなぜですか?

では、なぜこれが起こるのでしょうか?


厳密な答えが見つかりました-http ://blogs.msdn.com/b/ericlippert/archive/2005/11/09/491031.aspx

4

4 に答える 4

7

クラス内からアクセスしているのではなく、変数にアクセスしようとしているのですpublic。あなたはこれがコンパイルされることを期待しないでしょう、そしてこれはあなたがやろうとしていることとほとんど同じです:

public class SomethingElse
{
    public void CallHowdy()
    {
        A a = new A();
        Console.WriteLine(a.Howdy);
    }
}

関係はなく、なぜその分野が公開されていないのか混乱しているようです。

今、あなたがしたいのであれば、あなたはこれを行うことができます:

public class B : A
{
    public void CallHowdy()
    {
        Console.Writeline(Howdy);
    }
}

このインスタンスBからデータを継承しているためです。A

于 2012-05-18T18:02:43.037 に答える
3

あなたができる

public class B : A                           
{
    public void CallHowdy()
    {
        Console.WriteLine(Howdy);
    }
}

コードでは、Bの内部からではなく、Aの外部からHowdyにアクセスしようとしています。ここでは、Bの内部にいるため、Aの保護されたメンバーにアクセスできます。

于 2012-05-18T18:02:26.877 に答える
1

基本クラスの保護されたメンバーは、派生クラスタイプを介してアクセスが行われる場合にのみ、派生クラスでアクセスできます。

AがBから派生していないため、エラーが発生します。

http://msdn.microsoft.com/en-us/library/bcd5672a(v=vs.90).aspx

于 2012-05-18T18:03:58.890 に答える
0

保護されたメンバーは、それ自体と派生メンバーにのみ表示されます。あなたの場合、Aの宣言は、他のクラスからAをインスタンス化した場合と同じように、パブリックメンバーのみがアクセス可能であることを意味します。ただし、単純にthis.Howdyと書くこともできます。これは、派生チェーンにより、HowdyはクラスBの内部から利用できるためです。

于 2012-05-18T18:03:59.337 に答える