为什么在C#中子类无法访问受保护的方法?

4
为什么我不能在C#的子类中访问受保护的方法?
类:
public abstract class A
{
    protected void Method()
    {

    }
}

子类:

public class B : A
{

}

控制台应用程序:

B b = new B();

b.Method();

编译器报错:错误 1 'Method()'由于其保护级别而无法访问

1个回答

17

protected并不意味着客户端代码可以通过派生类实例访问它。

它的确意味着派生类的代码可以使用它。例如,this是有效的:

public class B : A
{
     public void SomeMethod()
     {
          Method();
     }
}

如果您希望您的确切代码示例正常工作,请将Method标记为public


谢谢您的回复,但是您能告诉我为什么会出现这种行为吗?根据MSDN文档: https://msdn.microsoft.com/en-us/library/ms173121.aspx“只有在同一类或结构中的代码,或者在从该类派生的类中才能访问类型或成员。”这非常微妙。是否有更深入的阅读材料可用于比MSDN文档更深入地了解此问题?(抱歉,我按下Enter键,提交了我的评论。) - The Cog
@TheCog 因为这是 protected 访问修饰符的规则。就其价值而言,在 C++ 中也是如此。这只是该关键字定义的内容。 - BradleyDotNET
根据MSDN文档(https://msdn.microsoft.com/en-us/library/ms173121.aspx)中的说明,在类和结构的可访问性方面:“派生类的可访问性不能比其基类型更高。换句话说,您不能有一个公共类B,它派生自一个内部类A。如果允许这样做,它将使A变为公共类,因为A的所有受保护或内部成员都可以从派生类中访问。” 这些信息帮助我理解了你的答案。谢谢。 - The Cog
此外,我认为这将是使用公共方法(建议)或公共虚方法的良好方式,以便在必要时可以在子类中进行覆盖。 - The Cog
@TheCog 这里的微妙之处在于它关系到代码所在的位置。在类定义中的代码可以访问protected成员,但是在类外部使用该类的随机代码则不能。我在学校学过这个知识点,所以我不知道有没有在线超级棒的解释 :( - BradleyDotNET

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接