“公共”构造函数在抽象类中的相关性

抽象类中的“公共”构造函数是否有任何相关性? 我想不出任何可能的方法来使用它,在这种情况下不应该被编译器视为错误(C#,不确定其他语言是否允许)。

示例代码:

internal abstract class Vehicle { public Vehicle() { } } 

C#编译器允许这个代码编译,而我无法从外部世界调用这个构造函数。 它只能从派生类调用。 所以不应该只允许’protected’和’private’修饰符。 请评论。

对于抽象类,没有理由使用公共构造函数。 我假设编译器没有抱怨的原因很简单,他们只是没有花时间来覆盖它,因为它是公共的还是受保护的并不重要。

在抽象类中,对于实例构造函数,修饰符publicprotected internalprotected都是等效的。 然后internal比他们更严格, private是最严格的访问。

如果所有实例构造函数都是private ,则只有嵌套在相关类中的类才能从中inheritance。

注意:如果没有为非静态类提供实例构造函数,则编译器将自行生成一个。 这是一个零参数的构造函数。 如果类是抽象的,则该自动生成的构造函数protected 。 否则它是public

如果抽象类的实例构造函数是publicprotected ,那么我可以想到的唯一情况就是使用reflection时。 举个例子,说

 ConstructorInfo[] ctors = typeof(Vehicle).GetConstructors(); 

如果唯一的构造函数protected ,则会给出一个空数组;如果是public构造函数,则给出一个长度为1的数组。 但是当然有一些指定BindingFlags重载,所以这不是问题,只要记住一个人使用reflection。

Dupe:还有另一个关于SO的问题就像这样: 抽象类构造函数访问修饰符

关于这个问题的答案最终归结为同样的事情:如果你声明它protectedpublic那并不重要。

在文献中似乎也有一些关于它的讨论(例如在框架设计指南中 )。 这篇博文中引用了这一点: 好的设计还是抽象类的糟糕设计?

是的,抽象类上的public ctor是无意义的并且有点误导,因为它将表现为受保护,因为只有派生类可以调用它。

private ctor除了有趣的边缘情况之外没什么意义

如果派生类需要, protected ctor将有意义。