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

时间:2012-05-18 17:59:41

标签: c# visual-studio-2010 encapsulation protected derived-class

我写了以下代码:

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

4 个答案:

答案 0 :(得分:7)

您不是从课程内部访问它,而是尝试访问变量,就好像它是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的数据。

答案 1 :(得分:3)

你可以做到

public class B : A                           
{
    public void CallHowdy()
    {
        Console.WriteLine(Howdy);
    }
}

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

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

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