【发布时间】:2017-12-14 22:55:17
【问题描述】:
我不明白为什么这段代码会给我一个 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();
}
}
在上面指出的那一行,我得到了错误:
错误 CS1540:无法通过“Node”类型的限定符访问受保护的成员“Node.ToText()”;限定符必须是“HtmlNode”类型(或派生自它)
HtmlNode 派生自Node,那么为什么HtmlNode 不能访问Node 的受保护成员?
我将如何修改代码以使用 "a qualifier of type HtmlNode",如错误消息中所建议的那样?
【问题讨论】:
-
问题是子节点列表是抽象节点的列表。那没有意义。抽象 Node 类必须像在 HTMLNODE 类中那样实现。要查看它的工作情况,请将子节点更改为 List
... -
@JohnPeters:我正在使用抽象,所以我认为它非常有意义。我可以有几个
Node的子类,并且应该能够访问所有这些子类都通用的方法。您的解决方法仅适用于HtmlNode类型的节点。这不是我需要的。 -
@AzarShaikh 如果
node不是HtmlNode,那么它将崩溃。 -
我在这里发现了类似的问题:stackoverflow.com/questions/13683324/…
-
@JohnPeters:但是
HtmlNode是实现抽象的类。为什么派生类不能访问基类的受保护成员?
标签: c# .net oop access-modifiers