C#中派生类访问受保护成员[复制](C# accessing protected member in

2019-06-24 14:21发布

这个问题已经在这里有一个答案:

  • 为什么我不能访问C#protected成员除了这个样子? 7个回答

我写了下面的代码:

public class A                             
{
    protected string Howdy = "Howdy!";     
}

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

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

不能访问受保护成员“AA”经由类型“A”的限定词; 限定符的类型必须是“B”(或从其导出的)的。

这似乎不合情理,我-我为什么不能访问protected从类的方法,这是从它派生的类的实例字段?

那么, 为什么会出现这种情况


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

Answer 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在此实例。



Answer 2:

你可以这样做

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

在你的代码,你想从访问你好一个A外,没有从B.中在这里,你是一个B的内部,因此能够访问受保护的成员A.



Answer 3:

基类的被保护的成员是仅当访问通过派生类类型发生派生类访问。

你得到错误,因为,因为A不是从衍生B.

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



Answer 4:

被保护成员不仅对本身及衍生会员可见。 在你的情况下,A的声明意味着只有公共成员都可以访问,就好像你从其它类实例化的一个。 你可以,但是,简单的写this.Howdy,因为,由于派生链,你好可从B类的内部



文章来源: C# accessing protected member in derived class [duplicate]