如何在该类中使派生类无法访问私有成员?

时间:2014-07-09 19:17:17

标签: c# inheritance

class A
{
    private int aa = 1;
}

class B : A
{
    private int bb = 5;

    void DoStuff()
    {
        aa = bb; //Error, as it should
    }
}

对战:

class A
{
    private int aa = 1;
    class B : A
    {
        private int bb = 5;

        void DoStuff()
        {
            aa = bb; //Not an error, bummer
        }
    }
}

相同的东西,只是组织不同。我正在使用第二种组织我的类的方法,因为在我正在做的事情中继承类内部看起来更清晰。我的问题是,在上面的例子中,我不希望A的私有成员可以访问B,即使它在A内部。我开始明白这是系统地做到这一点,但我真的被迫如果我希望A的私人成员是B私人成员,请将他们分开吗?

4 个答案:

答案 0 :(得分:6)

是的,如果您不希望B访问A的私有成员,您真的被迫将声明分开,因为嵌套类可以访问其包含类私有成员。 / p>

答案 1 :(得分:4)

你不能这样做。

嵌套类是类成员,就像方法一样。所有班级成员都可以看到其他成员,甚至是私人。正如您可以从方法中看到私有字段。

如果你想这样做,这可能意味着你的嵌套类不应该首先嵌套。

答案 2 :(得分:2)

  如果我想让A的私人成员从B私下来,我真的被迫将他们分开吗?

是。来自the documentation

  

嵌套类型可以访问其包含类型可访问的所有成员。它可以访问包含类型的私有和受保护成员,包括任何继承的受保护成员。

为什么这很重要?由于您可以控制B中的内容,如果您不希望B使用A中的任何内容,则不会使用

答案 3 :(得分:0)

这里的所有其他答案都是正确的,提到你无法完成你想要做的事情,如果你嵌套你的类而不是使用单独的声明和继承。

您应该检查的一件事是您正在做的事情背后的真实设计,并指导您选择哪种设计方法。

如果您不打算让任何外部类访问Class B并且Class A中严格要求其功能,则无法(并且不需要)隐藏成员来自A的{​​{1}}因为B在这种情况下 实际上是B的成员,具有与该类中的方法相同的访问权限

如果您打算将此类暴露给其他潜在的类,那么设计(不是代码清洁/组织问题)应该引导您进入第一种方法并将声明分开。