为什么可以';t我有一个从内部类继承的公共类
本文关键字:继承 内部类 有一个 为什么 | 更新日期: 2023-09-27 18:19:33
我不理解下面显示的可访问性限制
public abstract class Base { }
internal class Common : Base { }
public class Instance : Common { }
这不会编译。
可访问性不一致:基类"Common"的可访问性低于类"Instance"
我可以用公共抽象类Common实现我想要的,但为什么我不能简单地不公开名称呢?
编辑:我要问的是为什么它是这样工作的!每个人都在回答规则是什么,而不是解释为什么规则是这样的。
public:访问不受限制内部:限制访问此程序
一旦被限制为程序,则a、internal class
的所有继承者必须保持internal
或具有较小的可访问性(protected internal
或private
)。
根据C#规范,§3.5.4节可访问性约束:
实例构造函数的参数类型必须至少为可作为实例构造函数本身访问。
在示例中
class A {...} public class B: A {...}
B类导致编译时错误,因为a不是与B.一样可访问
还有:
类类型的直接基类必须至少可访问作为类类型本身(§3.5.2)。例如,它是一个编译时公共类从私有类或内部类派生时出错。
如果您试图创建一个Common
类,该类具有您不希望外部代码访问的功能,那么您应该更喜欢组合而不是继承。例如:
public abstract class Base
{
...
}
internal class Common : Base
{
...
}
public class Instance
{
internal Instance(Common common)
{
...
}
...
}
这取决于代码对其他程序集的可见性。通过将Common设置为内部,您将限制对其程序集的Common访问,而通过将Instance设置为公共,您将使任何引用程序集都可以访问Instance。如果引用程序集不能访问类型的基类,它如何访问从该基类继承的任何成员?
如果Common
包含属性,比如Foo
:
public string Foo { get; set; }
则CCD_ 8类将自动公开该属性。你可以这样想:
public void Test()
{
Common myInstance = new Instance();
System.Console.WriteLine(myInstance.Foo);
}
由于Instance
需要公开Common
所拥有的所有内容,因此基类上的访问修饰符不能少公开。
但是,您可以将属性Foo
创建为内部属性,以实现大致相同的功能。