受保护成员的可访问性

时间:2013-08-05 11:42:08

标签: c# oop protected

我已经在互联网和书籍上阅读了protected成员只能在班级内和仅在派生班级中访问的内容。我正在尝试以下代码

  class Program
{
    static void Main(string[] args)
    {

    }
}
abstract class A
{
    protected int n_IntA = 0;
    public abstract void AMethod();
}
abstract class B : A
{
    int nb;
    public B()
    {

    }
    public abstract void GetProtected();      
    public override void AMethod()
    {

    }
}
class C : B
{
    public override void GetProtected()
    {
        // Here n_IntA is accessible why ??
    }
}

但是在课堂c n_IntA中可以访问。为什么? A的派生类是B。因此n_IntA的可访问性必须仅限于B类?

2 个答案:

答案 0 :(得分:2)

可访问性通过继承树的 ALL 进行。

如果您没有明确隐藏成员,例如使用new - 运算符,则可以在继承树的远端访问这些成员。
看一下MSDN,看看深度继承有多深入,特别是在WinForms和WPF类中。如果您无法访问System.Object中定义的成员,整个框架将会破坏......

来自MSDN

  

使用访问修饰符public,protected,internal或private为成员指定以下声明的可访问性级别之一。

     

...
  受保护访问仅限于从包含类派生的包含类或类型。

答案 1 :(得分:2)

无论层次结构的级别如何,始终可以从派生类访问受保护的成员。问题n_IntA可以访问,因为

C继承自A

的B继承

你也没有修改B类中的说明符,它在B中保持受保护,而C

也是如此