抽象类中的
public
构造函数有什么相关性吗?
我想不出任何可能的方法来使用它,在这种情况下,编译器不应该将其视为错误(C#,不确定其他语言是否允许)。
示例代码:
internal abstract class Vehicle
{
public Vehicle()
{
}
}
C# 编译器允许编译此代码,但我无法从外部调用此构造函数。它只能从派生类调用。
那么它不应该只允许
protected
和 private
修饰符吗?
抽象类没有必要使用公共构造函数。我认为编译器不抱怨的原因很简单,他们只是没有花时间讨论这一点,因为它是公共的还是受保护的并不重要。
在抽象类内部,对于实例构造函数,修饰符
public
、protected internal
和 protected
都是等效的。那么internal
比他们更严格,private
是最严格的准入。
如果所有实例构造函数都是
private
,则只有嵌套在相关类中的类才能继承它。
注意:如果没有为非静态类提供实例构造函数,则编译器将自行生成一个实例构造函数。这是一个带有零参数的构造函数。如果类是抽象类,则自动生成的构造函数是
protected
。否则就是public
。
我能想到的唯一情况是,抽象类的实例构造函数是
public
或 protected
会产生影响,那就是当你使用反射时。举个例子,说
ConstructorInfo[] ctors = typeof(Vehicle).GetConstructors();
如果唯一的构造函数是 protected
,则将给出一个空数组;如果是
public
,则将给出一个长度为 1 的数组。但是当然,有一些重载指定了 BindingFlags
,所以这不是问题,只是使用反射时要记住的事情。
Dupe:还有另一个问题,就像这样:抽象类构造函数访问修饰符
这个问题的答案最终归结为同一件事:声明它
protected
或 public
并不重要。
文献中似乎也有一些关于它的讨论(例如在框架设计指南中)。这篇博文中引用了这一点:抽象类的好设计还是坏设计?
是的,抽象类上的
public
ctor 是没有意义的,而且有点误导,因为它会表现得受保护,因为只有派生类可以调用它。
一个
private
ctor 在有趣的边缘情况之外将没有任何意义。
如果派生类需要,protected
ctor 就有意义。