c# – 无法访问派生类中的受保护方法
作者:互联网
我不明白为什么这段代码会给我一个Intellisense错误.
public abstract class Node
{
protected abstract string ToText();
}
public class HtmlNode : Node
{
public List<Node> ChildNodes { get; set; }
protected override string ToText()
{
StringBuilder builder = new StringBuilder();
foreach (var node in ChildNodes)
builder.Append(node.ToText()); // <=== THIS IS THE ERROR
return builder.ToString();
}
}
在上面指出的行上,我收到错误:
Error CS1540: Cannot access protected member ‘Node.ToText()’ via a qualifier of type ‘Node’; the qualifier must be of type ‘HtmlNode’ (or derived from it)
HtmlNode派生自Node,为什么HtmlNode不能访问受保护的Node成员?
我将如何修改代码以使用“HtmlNode类型的限定符”,如错误消息中所示?
解决方法:
在我看来,您可以通过继承机制访问受保护的成员,但您仍然无法通过实例访问受保护的成员.
根据MSDN,protected关键字表示以下内容:
protected
– Access is limited to the containing class or types derived from the containing class.
现在,让我们假设编译器允许您编译它,现在您正在迭代您的集合并调用.ToText()方法.
如果node是HtmlNode或其子类,则可以调用此方法.
但是,如果node是某种类型的AnotherNode:
public class AnotherNode : Node
{
protected override string ToText()
{
}
}
在这种情况下,您尝试调用AnotherNode类的受保护ToText方法.
你是一个“包含类(AnotherNode)”吗?没有.
你是“从AnotherNode派生的类型”吗?没有.
因此,看起来您应该无法访问此方法.
由于ChildNodes是在编译时未知的类型的实例,因此编译器无法确定您是否应该访问其方法.
这就是我如何看待编译器抛出此异常的原因.
标签:c,oop,net,access-modifiers 来源: https://codeday.me/bug/20190717/1486869.html