11

这似乎是一个新手问题,但你能解释为什么方法 Der.B() 不能通过基类变量访问受保护的 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
}

谢谢!

4

5 回答 5

22

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

假设您有另一个从 Base 派生的派生类 Frob。现在您将 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

于 2009-12-03T00:42:17.043 回答
4

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

于 2009-12-02T22:09:59.960 回答
3

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

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
}
于 2009-12-14T06:57:42.190 回答
2

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

在:

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

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

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

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

于 2009-12-02T22:14:21.040 回答
0

在您尝试的场景中,您将希望对 int Foo 使用“内部”。

于 2009-12-02T22:09:32.593 回答