【问题标题】:Relevance of 'public' constructor in abstract class抽象类中“公共”构造函数的相关性
【发布时间】:2011-02-14 02:31:29
【问题描述】:

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

示例代码:

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

C# 编译器允许编译此代码,而我无法从外部调用此构造函数。它只能从派生类中调用。 所以它不应该只允许“受保护”和“私人”修饰符。 请发表评论。

【问题讨论】:

  • @JohnSaunders 是的,重复,虽然这个问题是关于 java 的。但是在这方面,jav 和 C# 绝对没有区别(我认为)。

标签: c# .net constructor abstract-class


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

    如果抽象类的实例构造函数是publicprotected,我能想到的唯一情况是使用反射。例如,说

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

    如果唯一的构造函数是protected,将给出一个空数组,如果它是public,则给出一个长度为1的数组。但当然也有指定BindingFlags 的重载,所以这不是问题,只是在使用反射时要记住的事情。

    【讨论】:

      【解决方案3】:

      欺骗:关于 SO 的另一个问题是这样的:Abstract class constructor access modifier

      这个问题的答案最终归结为同一件事:你声明它是protected 还是public 并不重要。

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

      【讨论】:

      • 这个问题是关于C#的,另一个是关于Java的。因此,这不是重复的。
      【解决方案4】:

      是的,抽象类上的 public ctor 没有意义,而且有点误导,因为它的行为就像受保护的那样,只有派生类可以调用它。

      private ctor 在有趣的边缘情况之外意义不大

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

      【讨论】:

      • private 构造函数在抽象类中确实有意义。
      • @dan04:除了与其他构造函数链接之外,它在任何情况下都有意义吗?
      猜你喜欢
      • 2013-08-29
      • 2010-11-24
      • 2010-12-13
      • 2011-06-15
      • 1970-01-01
      • 2011-05-30
      • 2014-05-18
      • 2011-08-01
      • 1970-01-01
      相关资源
      最近更新 更多