代码之家  ›  专栏  ›  技术社区  ›  Manish Basantani

抽象类中“public”构造函数的相关性

  •  16
  • Manish Basantani  · 技术社区  · 14 年前

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

    样例代码:

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

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

    4 回复  |  直到 14 年前
        1
  •  6
  •   Hakan Fıstık    6 年前

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

        2
  •  3
  •   Jeppe Stig Nielsen    12 年前

    在抽象类中,例如实例构造函数、修饰符 public , protected internal protected 都是等效的。然后 internal 比他们更严格,而且 private 是最严格的访问。

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

    注意:如果没有为非静态类提供实例构造函数,那么编译器将自己生成一个。这是一个采用零参数的构造函数。如果类是抽象的,则自动生成的构造函数是 受保护的 . 否则就是 公众的 .

    如果抽象类的实例构造函数是 公众的 受保护的 ,是使用反射的时候。举个例子,说

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

    如果唯一的构造函数是 受保护的 和一个长度为1的数组 公众的 . 但是,当然也有一些重载指定 BindingFlags 所以这不是一个问题,只要记住,如果你使用反射。

        3
  •  1
  •   Community Mike Kinghan    7 年前

    杜佩:还有一个问题是这样的: Abstract class constructor access modifier

    这个问题的答案归根结底是一样的:如果你声明它,那就不重要了。 protected public .

    另外,在文学中似乎也有一些关于它的讨论(例如 Framework Design Guidelines )这在blogpost中引用: Good design or bad design of abstract class?

        4
  •  1
  •   Sky Sanders    14 年前

    是的,A public 抽象类上的ctor没有意义,并且有点误导性,因为它的行为受保护,只有派生类才能调用它。

    private Cor将拥有 小意思 在有趣的边缘案例之外。

    protected 如果派生类需要的话,ctor是有意义的。