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