我不明白下面显示的可访问性限制
public abstract class Base { }
internal class Common : Base { }
public class Instance : Common { }
这不会编译。
可访问性不一致:基类'Common'比类'Instance'
更难访问
我可以通过公共抽象类Common完成我想要的但是为什么我根本不能公开这个名字?
编辑:我要问的是为什么以这种方式运作!每个人都在回答规则是什么,而不是解释规则为何如此。
答案 0 :(得分:3)
类的继承者不能扩展基类的可访问性范围。
公众:访问不受限制 内部:访问限于此程序
一旦受限于该计划,a internal class
的所有继承人必须保持internal
或假设可访问性较低(protected internal
或private
)。
根据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
创建为内部属性以完成相同的操作。