可能重复:
Why can’t I access C# protected members except like this?
当我正在阅读一本c#书(特别注释版本,它显示了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
意思是:
访问限于此类或从此类派生的类
问题
为什么存在此限制(通过实例)?
您能请提供一个有问题的情况示例,就像它被允许一样吗?
答案 0 :(得分:2)
您引用的受保护意义不是技术定义,而仅仅是规范引用的直观含义(第3.5.1节):
受保护的直观含义是“访问仅限于 包含从包含类“。
派生的类或类型
在同一部分中,它给出了更严格的定义(此处M是T类型的成员):
否则,如果M受保护,则允许访问(如果发生) 在声明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
的定义,将允许前两个作业。这将是相当奇怪的。说我有我的图书馆,我定义了A
和B
,但我让你继承A
,你写了C
。作为一个图书馆作者,我会有点担心,有些人可以修改我写的课程实例中的内部细节!当然,您可以通过属性或方法公开x
中字段C
的修改,但该行为仅限于您的类C
的实例。
答案 1 :(得分:1)
这是你第二个问题的一个很好的答案
此限制可防止一个派生类访问其他派生的受保护成员 派生类,即使成员是从同一个基类继承的。
以下是现有问题的链接
Is there a way to reach a `protected` member of another object from a derived type?