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