C# 中实例成员的受保护访问? [复制]
Posted
技术标签:
【中文标题】C# 中实例成员的受保护访问? [复制]【英文标题】:Protected Access for Instance Members in C#? [duplicate] 【发布时间】:2012-11-27 15:44:57 【问题描述】:可能重复: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
意思:
访问仅限于此类或从此类派生的类
问题
为什么存在这个限制(通过instances)?
您能否请提供一个问题情况的示例,就好像它是允许的一样?
【问题讨论】:
这是一个 msdn 示例,并删除了重要部分:在 A 中,可以通过 A 和 B 的实例访问 x,因为在任何一种情况下,访问都是通过 A 的实例进行的或从 A 派生的类。但是,在 B 中,无法通过 A 的实例访问 x,因为 A 不是从 B 派生的。如果您通过 cx = 从 B 派生 C,您甚至可以操作 x,但不能通过一个。你可以访问当前类的实例变量,而不是父类的实例。 【参考方案1】:您引用的受保护含义不是技术定义,而仅仅是规范引用的直观含义(第 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
的定义,将允许前两个分配。这将是相当奇怪的。假设我有我的库,我定义了A
和B
,但我让你从A
继承,你写了C
。作为库作者,我会有点担心有人可以修改我编写的类实例中的内部细节!当然,您可以通过属性或方法公开对 C
中字段 x
的修改,但该行为仅限于您的类 C
的实例。
【讨论】:
【参考方案2】:这是你第二个问题的一个很好的答案
此限制阻止一个派生类访问其他类的受保护成员 派生类,即使成员是从同一个基类继承的。
这是现有问题的链接
Is there a way to reach a `protected` member of another object from a derived type?
【讨论】:
以上是关于C# 中实例成员的受保护访问? [复制]的主要内容,如果未能解决你的问题,请参考以下文章