【Swift】构造函数init继承的规则

总结:

1、子类未自定义指定构造器 ->  【继承全部父类构造器,包含指定和便利构造器】

2、子类自定义指定构造器 重载了父类的指定构造器【仅继承父类的便利构造器】

3、子类自定义指定构造器 重载父类的指定构造器【不继承父类任何构造器】

构造器的自动继承

如上所述,子类在默认情况下不会继承父类的构造器。但是如果满足特定条件,父类构造器是可以被自动继承的。事实上,这意味着对于许多常见场景你不必重写父类的构造器,并且可以在安全的情况下以最小的代价继承父类的构造器。

假设你为子类中引入的所有新属性都提供了默认值,以下 2 个规则将适用:

规则 1

如果子类没有定义任何指定构造器,它将自动继承父类所有的指定构造器。

规则 2

如果子类提供了所有父类指定构造器的实现——无论是通过规则 1 继承过来的,还是提供了自定义实现——它将自动继承父类所有的便利构造器。

即使你在子类中添加了更多的便利构造器,这两条规则仍然适用。

注意

子类可以将父类的指定构造器实现为便利构造器来满足规则 2。

基于官方的案例参考:

class Food {
    var name: String
    init(name: String) {
        self.name = name
    }
    
    convenience init(type:String) {
        self.init(name: "[Unnamed]")
    }
}

class RecipeIngredient: Food {
    var quantity: Int
    init(name: String, quantity: Int) {
        self.quantity = quantity
        super.init(name: name)
    }
    override convenience init(name: String) {
        /*
            1、重载了父类的指定构造器且使用了便利构造器的方式
            2、满足了【重载父类指定构造器】的条件,则自动继承父类全部便利构造器!
         */
        self.init(name: name, quantity: 1)
    }
}

class ShoppingListItem: RecipeIngredient {
    /*
        1、子类没有定义任何指定构造器,它将自动继承父类所有的指定构造器。
     */
    var purchased = false
    var description: String {
        var output = "\(quantity) x \(name)"
        output += purchased ? " ✔" : " ✘"
        return output
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_43343144/article/details/130283409