【问题标题】:Inconsistent accessibility with abstract classes与抽象类的可访问性不一致
【发布时间】:2012-08-06 14:47:39
【问题描述】:

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

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

PublicClassBase 有一个 XXX 类型为 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 内可见,而不能在其外部可见。

我也认为我了解访问修饰符,但显然我不了解:)

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

【问题讨论】:

    标签: c# public internal protected access-modifiers


    【解决方案1】:

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

    显然,您不能同时拥有两者,因此会出现错误。

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

    【讨论】:

    • 解决方法是将成员从protected 更改为internal
    【解决方案2】:

    鉴于您提供给我的程序集,其中包含上述类,我可以继续在引用您的程序集的不同程序集中创建 PublicClassBase 的子类。

    在那个类中,我必须实现 InternalClassBase 类型的受保护成员 XXX - 显然我不能,因为 InternalClassBase 被标记为 internal

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-12
      • 1970-01-01
      • 2012-11-19
      • 2021-01-29
      • 1970-01-01
      • 2012-10-27
      相关资源
      最近更新 更多