C#受保护的成员通过基类变量访问

时间:2009-12-02 22:06:24

标签: c# inheritance protected base-class

这似乎是一个相当新手的问题,但你能解释为什么方法Der.B()无法通过Base类变量访问受保护的Foo吗?这对我来说很奇怪:

public class Base
{
    protected int Foo;
}

public class Der : Base
{
    private void B(Base b) { Foo = b.Foo; } // Error: Cannot access protected member

    private void D(Der d) { Foo = d.Foo; } // OK
}

谢谢!

5 个答案:

答案 0 :(得分:22)

这是一个经常被问到的问题。要弄清楚为什么这是非法的,请考虑可能出现的问题。

假设您有另一个派生类Frob派生自Base。现在你将Frob的一个实例传递给Der.B.你能从Der.B访问Frob.Foo吗?不,绝对不是。 Frob.Foo受到保护;它只能从Frob和Frob的子类访问。 Der不是Frob,也不是Frob的子类,因此它无法访问Frob的受保护成员。

如果不清楚,请参阅我关于此主题的文章:

http://blogs.msdn.com/ericlippert/archive/2005/11/09/491031.aspx

答案 1 :(得分:4)

在B中,您尝试访问另一个类的受保护成员。你继承这个类的事实是无关紧要的。在D中,您正在访问当前类的基类的受保护成员。在此上下文中,您可以访问Der及其继承类型的受保护成员中的任何内容。

答案 2 :(得分:2)

简单地说,protected允许访问子类。

在:

private void B(Base b) { Foo = b.Foo; }

您正在尝试访问您的Der实例无权访问的受保护成员。如果它是当前Der(this)实例的基类,它只能访问它。

private void D(Der d) { Foo = d.Foo; } // OK

正常工作,因为您正在通过Der访问它的基类保护方法。

答案 3 :(得分:2)

您可以通过在基类中声明静态方法来解决此限制:

public class Base
{
    protected int Foo;

    protected static int GetFoo(Base b)
    {
        return b.Foo;
    }
}

public class Der : Base
{
    private void B(Base b) { Foo = GetFoo(b); } // OK
}

答案 4 :(得分:0)

在您尝试的场景中,您将要使用“内部”作为int Foo。