3

Possible Duplicate:
Why can’t I access C# protected members except like this?

As I was reading a c# book (special annotated version which shows all the tricky part of c#)

I saw this code :

public class A
{
    protected int x;
    static void F(A a, B b)
    {
        a.x = 1; // Okay
        b.x = 1; // Okay
    }
}
public class B: A
{
    static void F(A a, B b)
    {
        a.x = 1; // Error: must access through instance of B
        b.x = 1; // Okay
    }
}

looking at protected meanning :

Access limited to this class or classes derived from this class

Questions

  • Why does this restriction (via instances) exists ?

  • Can you please supply an example of a problematic situation as if it was allowed ?

4

2 に答える 2

2

あなたの引用された保護された意味は技術的な定義ではなく、単に仕様が直感的な意味として引用しているものです(セクション3.5.1):

protected の直感的な意味は、「包含クラスまたは包含クラスから派生した型に制限されたアクセス」です。

同じセクションのさらに下では、より厳密な定義が示されています (ここで、M は型 T のメンバーです)。

それ以外の場合、M が保護されている場合、M が宣言されているクラス内で発生した場合、または M が宣言されたクラスから派生したクラス内で発生し、派生クラス型 (§3.5) を介して発生した場合、アクセスは許可されます (§3.5 .3)。

参照されているセクション (3.5.3) は、具体的には保護されたメンバー アクセスに関するものであり、メモ付きの例が含まれています。

この制限により、メンバーが同じ基本クラスから継承されている場合でも、1 つの派生クラスが他の派生クラスの保護されたメンバーにアクセスできなくなります。

したがって、答えは明らかです。これは、サード クラスが次のようなことを行うのを防ぐように設計されています。

public class C : A
{
  public static void F(A a, B b, C c)
  {
     a.x = 1; // not allowed
     b.x = 1; // not allowed
     c.x = 1; // allowed
  }
}

最初の 2 つの割り当ての定義protectedが許可されます。これはかなり奇妙です。私が自分のライブラリを持っていて、 and を定義 しABとしましょう。ライブラリの作成者として、私が書いたクラスのインスタンスの内部の詳細を誰かが変更できることに少し不安を感じるでしょう! 確かに、プロパティまたはメソッドを介してフィールドの変更を公開できますが、その動作はクラスのインスタンスに限定されます。ACxCC

于 2012-12-10T09:17:09.743 に答える
1

これがあなたの2番目の質問に対する良い答えです

この制限により、メンバーが同じ基本クラスから継承されている場合でも、1 つの派生クラスが他の派生クラスの保護されたメンバーにアクセスできなくなります。

ここに既存の質問へのリンクがあります

派生型から別のオブジェクトの「保護された」メンバーに到達する方法はありますか?

于 2012-12-10T08:48:20.107 に答える