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

时间:2010-04-30 05:12:11

标签: c# .net constructor abstract-class

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

示例代码:

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

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

4 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:3)

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

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

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

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

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

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

在文献中似乎也有一些关于它的讨论(例如在Framework Design Guidelines中)。这篇博文中引用了这一点:Good design or bad design of abstract class?