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

Posted

技术标签:

【中文标题】C#访问派生类中的受保护成员[重复]【英文标题】:C# accessing protected member in derived class [duplicate] 【发布时间】:2012-05-26 07:38:07 【问题描述】:

我写了以下代码:

public class A                             

    protected string Howdy = "Howdy!";     


public class B : A                           

    public void CallHowdy()
    
        A a = new A();
        Console.WriteLine(a.Howdy);
    

现在,在VS2010 中会导致以下编译错误:

无法通过“A”类型的限定符访问受保护的成员“A.a”;限定符必须是“B”类型(或派生自它)。

这对我来说似乎很不合逻辑 - 为什么我不能从派生自类的方法访问类实例的 protected 字段?

那么,为什么会发生这种情况


找到一个严格的答案 - http://blogs.msdn.com/b/ericlippert/archive/2005/11/09/491031.aspx

【问题讨论】:

+1 表示写得很清楚的问题。 :) 你可以做的是创建一个受保护的静态方法,它只提供对派生类的访问,如下所示: public class A protected string Howdy = "Howdy!"; 公共类 B : A public void CallHowdy() A a = new A(); Console.WriteLine(a.Howdy); 【参考方案1】:

您不是从类内部访问它,而是尝试访问该变量,就好像它是public。你不会期望它编译,这几乎就是你想要做的:

public class SomethingElse

    public void CallHowdy()
    
        A a = new A();
        Console.WriteLine(a.Howdy);
    

没有关系,听起来你很困惑为什么该字段不公开。

现在,如果你愿意,你可以这样做:

public class B : A

    public void CallHowdy()
    
        Console.Writeline(Howdy);
    

因为在这种情况下,B 继承了 A 的数据。

【讨论】:

嗯,实际上,我对在php5 中这样做的可能性感到困惑(我也问过这个问题:***.com/questions/10653991/php5-member-visibility)。像这样的差异背后应该有一个强大的原因,你不这么认为吗? 嗯,PHP 似乎是一个奇怪的地方,因为它似乎非法公开了一个受保护的变量。 C# 中的类型边界似乎比 PHP 更严格。 我也很困惑,因为在相应的PHP 问题中的每个人都一直在告诉我诸如“为什么不能访问它?那是完全有效的”之类的事情。我猜这个问题更多的是关于某些编码习惯。 B 可以访问其自己的实例的受保护数据,而不是其他实例的值。【参考方案2】:

你可以的

public class B : A                           

    public void CallHowdy()
    
        Console.WriteLine(Howdy);
    

在您的代码中,您尝试从 A 外部而不是 B 内部访问 Howdy。在这里,您在 B 内部,因此可以访问 A 中的受保护成员。

【讨论】:

【参考方案3】:

只有通过派生类类型进行访问时,才能在派生类中访问基类的受保护成员。

您收到错误是因为 A 不是从 B 派生的。

http://msdn.microsoft.com/en-us/library/bcd5672a(v=vs.90).aspx

【讨论】:

【参考方案4】:

受保护的成员仅对其自身和派生成员可见。在您的情况下, A 的声明意味着只有公共成员是可访问的,就像您从任何其他类实例化 A 一样。但是,您可以简单地写 this.Howdy,因为由于派生链,Howdy 可以从 B 类内部获得。

【讨论】:

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

为啥我不能访问静态多态派生类中的受保护成员?

访问派生类中的受保护成员

从派生类访问基类中的受保护成员

在派生类中无法访问受保护的成员

无法访问派生类中的受保护方法

在派生类中使用来自虚拟基类的受保护 ctor