与抽象类不可访问的可访问性

时间:2012-08-09 11:26:42

标签: c# public internal protected access-modifiers

我有一个内部抽象类InternalClassBase和两个(也是内部)类InternalClass1InternalClass2,它们继承自InternalClassBase

我还有一个公共抽象类PublicClassBase和两个(也是公开的)类PublicClass1PublicClass2,它们继承自PublicClassBase

PublicClassBaseXXX类型的受保护成员InternalClassBase,因此PublicClass1PublicClass2都可以使用它。

这是我的代码:

internal abstract class InternalClassBase { }
internal class InternalClass1 : InternalClassBase { }
internal class InternalClass2 : InternalClassBase { }

public abstract class PublicClassBase
{
    protected InternalClassBase XXX;  // this is where the error happens
}
public class PublicClass1 : PublicClassBase { }
public class PublicClass2 : PublicClassBase { }

为什么我的示例中不能PublicClassBase包含XXX成员?我认为XXX仅在PublicClassBasePublicClass1PublicClass2中可见,但不在其中。{/ p>

我还认为我理解访问修饰符,但显然我没有:)

编辑 - 在PublicClassBase中声明XXX时发生错误,并且异常消息是:不一致的可访问性:字段类型'ClassLibrary2.InternalClassBase'比字段'ClassLibrary2.PublicClassBase.XXX'更难访问,但是如何保护更多可以访问内部吗?

2 个答案:

答案 0 :(得分:5)

想象一下,在一个程序集 other 而不是声明示例中的一个类型中,您声明继承自PublicClass3的类PublicClassBase。字段XXX应该在PublicClass3中可见,因为它受到保护,但字段的类型是内部的,因此同时,可以从PublicClass3

显然,你不能同时拥有这两个错误。

您可以通过制作字段private或制作PublicClassBase及其子internal来解决此问题。

答案 1 :(得分:2)

鉴于你提供给我的汇编,包含上面的类,我可以继续在不同的汇编中创建PublicClassBase的子类,引用你的。

在该课程中,我必须实施XXX类型的受保护成员InternalClassBase - 显然我不能,因为InternalClassBase被标记为internal。< / p>