37

可以在.NET 中保护类吗?
为什么/这不可能?

4

4 回答 4

76

是的,你不能让它们成为顶级类,它们必须是内部类

public class Outer
{
    protected class Foo
    {
    }
}

这很好,这意味着唯一允许看到 Foo 的类是 Outer 的子类

class X 
{
    // 'Outer.Foo' is inaccessible due to its protection level
    private void Flibble(Outer.Foo foo)
    {
    }
}

class X : Outer
{
    // fine
    private void Flibble(Outer.Foo foo)
    {
    }
}

请注意,您不能在 c# 中将任何外部类声明为私有、受保护(或受保护的内部),因为外部级别类的访问修饰符定义了它们相对于其他程序集的可见性。仅在程序集中(或通过 InternalsVisibleTo 对朋友可见)或在程序集外部特别可见。

因此,虽然此处使用公共/内部标识符以保持一致性,但 IL 中的状态实际上只是“公共”或“非公共”(如Reflection.Emit 标志所示

于 2009-06-19T12:53:02.910 回答
12

protected可见性用于指示“对派生类可见”。这对类内部的东西是有意义的,但通常在类级别没有意义。

唯一的例外是内部类,其中受保护的可见性意味着派生类可以访问内部类。

于 2009-06-19T12:53:14.173 回答
2

是的,我们只是不能让它们成为顶级类,它们必须是内部类

于 2009-06-19T15:09:42.820 回答
0

不能在命名空间内定义受保护的类。它只能声明为嵌套类。它可以在其他嵌套类中实例化,可以被其他嵌套类继承,也可以从其他嵌套类继承。

嵌套类以及从父类(派生类或子类)继承的类可以访问父类的受保护成员。

于 2018-06-06T11:43:50.897 回答