为什么子类在覆盖所有指定的初始化程序时继承了便利初始化程序?

时间:2017-07-24 15:18:04

标签: swift

class Parent {
    var a : Int
    init(a : Int) {
        self.a =a
    }
    convenience init() {
        self.init(a : 10)
    }
}
class Child : Parent {
    var b : Int
    override init(a : Int){
        b = 10
        super.init(a : a)
    }
}

var child = Child() // i know that convenience initializer is inherited, but why??
child.a // 10
child.b // 10

我知道便利初始化器是继承的,但为什么? 我只是覆盖所有指定的初始化程序?那为什么需要呢?

1 个答案:

答案 0 :(得分:3)

这是The Swift Programming Language

中描述的规则
  

规则2   如果您的子类提供了所有超类指定初始化器的实现 - 通过按照规则1继承它们,或者通过提供自定义实现作为其定义的一部分 - 那么它会自动继承所有超类便捷初始化器。

如果子类的客户端不想使用它们,那么继承便利初始化器不是 (就像继承方法和属性不需要 如果子类的客户端没有不要使用它们,但在我看来这是很自然的事情。

继承所有超类的API是子类的默认值,因此如果可能,也应继承便捷初始化器。由于方便初始值设定项需要调用兄弟指定的初始值设定项,因此只有在子类中重写了所有指定的初始值设定项时,编译器才能确保所有属性都能正确初始化。