通过基类变量访问的 C# 受保护成员 [重复]

Posted

技术标签:

【中文标题】通过基类变量访问的 C# 受保护成员 [重复]【英文标题】:C# protected members accessed via base class variable [duplicate] 【发布时间】:2010-12-22 14:41:40 【问题描述】:

这似乎是一个新手问题,但你能解释一下为什么方法 Der.B() 不能通过基类变量访问受保护的 Foo 吗?我觉得这很奇怪:

public class Base

    protected int Foo;


public class Der : Base

    private void B(Base b)  Foo = b.Foo;  // Error: Cannot access protected member

    private void D(Der d)  Foo = d.Foo;  // OK

谢谢!

【问题讨论】:

【参考方案1】:

您可以通过在基类中声明一个静态方法来解决此限制:

public class Base

    protected int Foo;

    protected static int GetFoo(Base b)
    
        return b.Foo;
    


public class Der : Base

    private void B(Base b)  Foo = GetFoo(b);  // OK

【讨论】:

【参考方案2】:

简单地说,protected 允许访问子类。

在:

private void B(Base b)  Foo = b.Foo; 

您正在尝试访问您的 Der 实例无权访问的受保护成员。只有当它是当前 Der 实例的基类时,它才能访问它(this)。

private void D(Der d)  Foo = d.Foo;  // OK

工作正常,因为您正在通过 Der 访问它的基类受保护方法。

【讨论】:

我想你的意思是说:private void D(Der d) Foo = d.Foo; 工作正常。有点令人困惑的 b/c 你复制了这行代码。 糟糕,我的意思是复制第二个代码示例。【参考方案3】:

在您尝试的场景中,您将希望对 int Foo 使用“内部”。

【讨论】:

如果 B 传递的是 Base 而不是 Der,这将不起作用。 我知道我可以使用 internal 甚至 public 而不是 protected。但我想了解为什么受保护的行为就像帖子中描述的那样。 @Roman:因为 protected 只对 Derived 类可见。在同一个实例内。但是您正试图从不同的实例中查看它。如果可以做到这一点,protected 将毫无用处。 @Roman - RagePotato 回答了这个问题。 尤里是正确的。我发布的代码是垃圾。哈哈。我删除了它。 Eric Lippert 的回答是正确的,此外,我想知道您为什么要这样做而不是内部化?【参考方案4】:

这是一个常见问题。要弄清楚为什么这是非法的,请想想可能出了什么问题。

假设您有另一个从 Base 派生的派生类 Frob。现在您将 Frob 的一个实例传递给 Der.B。您应该能够从 Der.B 访问 Frob.Foo 吗?不,绝对不是。 Frob.Foo 受到保护;它应该只能从 Frob 和 Frob 的子类访问。 Der 不是 Frob,也不是 Frob 的子类,因此它无法访问 Frob 的受保护成员。

如果不清楚,请参阅我关于该主题的文章:

http://blogs.msdn.com/ericlippert/archive/2005/11/09/491031.aspx

【讨论】:

谢谢。我现在清楚了。【参考方案5】:

在 B 中,您试图访问另一个类的受保护成员。您从该类继承的事实是无关紧要的。在 D 中,您正在访问当前类的基类的受保护成员。在这种情况下,您可以从 Der 及其继承的类型的受保护成员中访问任何内容。

【讨论】:

+1 进行解释,但我仍然怀疑为什么“您从该类继承的事实无关紧要”?它是规范谓词吗? 如果有人初始化了 Der,您从它继承的事实使您可以访问它。在这种情况下,您可以将其转换为 Der,然后访问 Foo。

以上是关于通过基类变量访问的 C# 受保护成员 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

可以通过[重复]在派生类中初始化受保护的基类成员

无法访问基类中的受保护成员 [重复]

无法从派生类构造函数参数访问受保护的基类成员[重复]

C#访问派生类中的受保护成员[重复]

C# 中base和this关键字

访问基类的受保护成员