ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-07-17 09:05:38  阅读:125  来源: 互联网

标签:c oop net 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();
    }
}

在上面指出的行上,我收到错误:

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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有