为什么我不能拥有从内部类继承的公共类?

时间:2012-01-05 05:43:51

标签: c# inheritance language-design

我不明白下面显示的可访问性限制

public abstract class Base { }
internal class Common : Base { }
public class Instance : Common { }

这不会编译。

  

可访问性不一致:基类'Common'比类'Instance'

更难访问

我可以通过公共抽象类Common完成我想要的但是为什么我根本不能公开这个名字?

编辑:我要问的是为什么以这种方式运作!每个人都在回答规则是什么,而不是解释规则为何如此。

3 个答案:

答案 0 :(得分:3)

类的继承者不能扩展基类的可访问性范围。

  

公众:访问不受限制   内部:访问限于此程序

一旦受限于该计划,a internal class的所有继承人必须保持internal或假设可访问性较低(protected internalprivate)。

根据C# specification§3.5.4辅助功能限制部分:

  

实例构造函数的参数类型必须至少为   可以作为实例构造函数本身访问。

     

在示例中

class A {...}

public class B: A {...}
     

B类导致编译时错误,因为A至少不是   像B一样可以访问。

此外:

  

类类型的直接基类必须至少是可访问的   作为类类型本身(§3.5.2)。例如,它是一个编译时   公共类从私有或内部类派生的错误。

如果您尝试创建具有您不希望外部代码访问的功能的Common课程,则应prefer composition over inheritance。例如:

public abstract class Base
{
...
}

internal class Common : Base
{
...
}

public class Instance
{
    internal Instance(Common common)
    {
        ...
    }
...
}

答案 1 :(得分:2)

这是代码对其他程序集的可见程度。通过创建Common internal,您可以限制对其程序集的Common访问,而通过将Instance设置为public,您可以使Instance对任何引用程序集都可访问。如果引用程序集无法访问类型的基类,那么它如何访问从该基类继承的任何成员?

答案 2 :(得分:0)

如果Common包含属性,请说Foo

public string Foo { get; set; }

Instance类自动公开该属性。你可以这样想:

public void Test()
{
    Common myInstance = new Instance();
    System.Console.WriteLine(myInstance.Foo);
}

由于Instance需要公开Common所有的内容,因此基类上的访问修饰符不能少曝光。

但是,您可以将属性Foo创建为内部属性以完成相同的操作。