编程语言
首页 > 编程语言> > c# – 无法访问派生类中的受保护方法

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