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

本文关键字:受保护 成员 访问 派生 | 更新日期: 2023-09-27 18:34:48

我写了以下代码:

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

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

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

你可以做

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

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

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

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

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

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