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

【讨论】:

【参考方案2】:

这是你第二个问题的一个很好的答案

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

这是现有问题的链接

Is there a way to reach a `protected` member of another object from a derived type?

【讨论】:

以上是关于C# 中实例成员的受保护访问? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

C++ 派生模板类:访问实例的受保护成员

C#:基类中的受保护方法;无法使用来自另一个类的派生类对象进行访问[重复]

Java中的间接子类无法访问的超类中的受保护成员

静态成员函数无法访问类的受保护成员

访问基类的受保护成员

在父类的子类中访问静态类的受保护成员