【问题标题】:Why is the base() constructor not necessary?为什么不需要 base() 构造函数?
【发布时间】:2010-03-31 20:59:51
【问题描述】:

我有一个类似的类结构

abstract class Animal {
  public Animal(){
    //init stuff..
  }
}

class Cat : Animal {
  public Cat(bool is_keyboard) : base() //NOTE here
  {
    //other init stuff
  }
}

那么,看一下上面提到的那一行。如果您删除: base(),那么它将编译而不会出现错误。

这是为什么?有没有办法禁用这种行为?

【问题讨论】:

    标签: c# inheritance constructor


    【解决方案1】:

    如果您不添加任何其他内容(任何: base(...): this(...)),则存在隐含的: base()。要强制它显式,请向基本构造函数添加一个参数。那么就不能隐含了。

    例如:

    public Animal(string name) {...}
    

    【讨论】:

    • 酷,你每天都会学到一些东西……我一直都明确地放置 base(),可能会继续这样做,因为有多少开发人员意识到隐式调用它?
    • 另外,我发现了 Skeet 的漂亮文章,它告诉了我所有相关信息:yoda.arachsys.com/csharp/constructors.html
    • @slugster,我没有意识到......所以是的。
    【解决方案2】:

    17.10.4 Default Constructors:

    如果一个类不包含实例 构造函数声明,默认 实例构造函数是自动的 假如。 2 那个默认构造函数 简单地调用无参数 直接基类的构造函数。 3 如果直接基类没有 有一个可访问的无参数 实例构造函数,编译时 发生错误。 4 如果班级是 抽象然后声明 默认的可访问性 构造函数受保护。 5 否则, 声明的可访问性 默认构造函数是公共的

    【讨论】:

    • 虽然是这样,但当 `:base()` 被删除时,这是错误的部分。该部分说明如果删除整个构造函数会发生什么。
    【解决方案3】:

    这是为什么?

    article 解释了它。

    有没有办法禁用它 行为?

    不。很抱歉(但是......请参阅标记答案以获取解决方法:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-25
      • 2020-03-10
      • 1970-01-01
      • 2018-06-02
      相关资源
      最近更新 更多