Jon*_*ood 3 .net c# oop access-modifiers
我不明白为什么这段代码会给我一个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();
}
}
Run Code Online (Sandbox Code Playgroud)
在上面指出的行上,我收到错误:
错误CS1540:无法通过类型为"Node"的限定符访问受保护成员'Node.ToText()'; 限定符必须是'HtmlNode'类型(或从中派生)
HtmlNode派生自Node,为什么不能HtmlNode访问受保护的成员Node?
我将如何修改代码以使用"类型的限定符HtmlNode",如错误消息中所示?
在我看来,您可以通过继承机制访问受保护的成员,但您仍然无法通过实例访问受保护的成员.
根据MSDN,protected关键字表示以下内容:
protected- 访问仅限于从包含类派生的包含类或类型.
现在,让我们假设编译器允许您编译它,现在您正在迭代您的集合和调用.ToText()方法.
如果node是HtmlNode或其子类,则可以调用此方法.
但是,如果node是某种类型AnotherNode:
public class AnotherNode : Node
{
protected override string ToText()
{
}
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,您尝试调用类的受保护ToText方法AnotherNode.
你是一个"包含类(AnotherNode)"吗?不
.你是"派生自AnotherNode的类型"吗?不.
所以,看起来您应该无法访问此方法.
由于ChildNodes是编译时未知的类型实例,编译器无法确定您是否应该访问其方法.
这就是我如何看待编译器抛出此异常的原因.