无法访问派生类中的受保护方法

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",如错误消息中所示?

Yel*_*yev 9

在我看来,您可以通过继承机制访问受保护的成员,但您仍然无法通过实例访问受保护的成员.

根据MSDN,protected关键字表示以下内容:

protected- 访问仅限于从包含类派生包含类类型.

现在,让我们假设编译器允许您编译它,现在您正在迭代您的集合和调用.ToText()方法.

如果nodeHtmlNode或其子类,则可以调用此方法.

但是,如果node是某种类型AnotherNode:

public class AnotherNode : Node
{
    protected override string ToText()
    {
    }  
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您尝试调用类的受保护ToText方法AnotherNode.
你是一个"包含类(AnotherNode)"吗?不
.你是"派生自AnotherNode的类型"吗?不.
所以,看起来您应该无法访问此方法.

由于ChildNodes是编译时未知的类型实例,编译器无法确定您是否应该访问其方法.
这就是我如何看待编译器抛出此异常的原因.

  • 我想这就是答案.回到我用C++编程时,我记得这很好.如果在C#中允许它会很有用. (2认同)