3

可能重复:
为什么我不能访问受 C# 保护的成员,除非这样?

当我在阅读 ac# book 时(特殊的注释版本,它显示了 c# 的所有棘手部分)

我看到了这段代码:

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
    }
}

protected意思:

访问仅限于此类或从此类派生的类

问题

  • 为什么存在此限制(通过实例)?

  • 能否提供一个有问题的情况的示例,就好像它被允许一样?

4

2 回答 2

2

您引用的受保护含义不是技术定义,而仅仅是规范引用的直观含义(第 3.5.1 节):

protected 的直观含义是“仅限于包含类或从包含类派生的类型的访问”。

在同一部分的更下方,它给出了更严格的定义(这里 M 是类型 T 的成员):

否则,如果 M 受保护,则如果访问发生在声明 M 的类中,或者如果访问发生在从声明 M 的类派生的类中并通过派生类类型发生(第 3.5 节),则允许访问.3)。

引用的部分(3.5.3)专门关于受保护的成员访问,并包含您的示例和注释:

此限制阻止一个派生类访问其他派生类的受保护成员,即使这些成员是从同一基类继承的。

这样答案就很清楚了。它旨在防止第三类做这样的事情:

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
  }
}

根据您protected对前两个分配的定义,将被允许。这将是相当奇怪的。假设我有我的库并且我定义了AB但是我让你继承A 并且你写了C. 作为库作者,我会有点担心有人可以修改我编写的类实例中的内部细节!当然,您可以通过属性或方法公开对字段x的修改,C但这种行为仅限于您的类的实例C

于 2012-12-10T09:17:09.743 回答
1

这是您第二个问题的好答案

此限制阻止一个派生类访问其他派生类的受保护成员,即使这些成员是从同一基类继承的。

这是现有问题的链接

有没有办法从派生类型中访问另一个对象的“受保护”成员?

于 2012-12-10T08:48:20.107 回答