与抽象类的可访问性不一致
Posted
技术标签:
【中文标题】与抽象类的可访问性不一致【英文标题】:Inconsistent accessibility with abstract classes 【发布时间】:2012-08-06 14:47:39 【问题描述】:我有一个内部抽象类InternalClassBase
和两个(也是内部的)类InternalClass1
和InternalClass2
,它们继承自InternalClassBase
。
我还有一个公共抽象类PublicClassBase
和两个(也是公共的)类PublicClass1
和PublicClass2
,它们继承自PublicClassBase
。
PublicClassBase
有一个 XXX
类型为 InternalClassBase
的受保护成员,因此 PublicClass1
和 PublicClass2
都可以使用它。
这是我的代码:
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
只能在PublicClassBase
、PublicClass1
和PublicClass2
内可见,而不能在其外部可见。
我也认为我了解访问修饰符,但显然我不了解:)
编辑 - 错误发生在 PublicClassBase 内声明 XXX 时,异常消息是:不一致的可访问性:字段类型 'ClassLibrary2.InternalClassBase' 比字段 'ClassLibrary2.PublicClassBase.XXX' 的可访问性更小,但如何保护更多可访问然后是内部的?
【问题讨论】:
【参考方案1】:想象一下,在一个程序集中 其他 不是您的示例中声明的一种类型,您声明的类 PublicClass3
继承自 PublicClassBase
。字段XXX
应该从PublicClass3
可见,因为它是受保护的,但是字段的类型是内部的,所以同时它应该不从PublicClass3
可见。
显然,您不能同时拥有两者,因此会出现错误。
您可以通过将字段设为private
或将PublicClassBase
及其子字段设为internal
来解决此问题。
【讨论】:
解决方法是将成员从protected
更改为internal
。【参考方案2】:
鉴于您提供给我的程序集,其中包含上述类,我可以继续在引用您的程序集的不同程序集中创建 PublicClassBase
的子类。
在那个类中,我必须实现 InternalClassBase
类型的受保护成员 XXX
- 显然我不能,因为 InternalClassBase
被标记为 internal
。
【讨论】:
以上是关于与抽象类的可访问性不一致的主要内容,如果未能解决你的问题,请参考以下文章
可访问性不一致:字段类型“世界”比字段“frmSplashScreen”更难访问