【问题标题】:Automatic initializer Inheritance's condition is the Initializer's signature自动初始化器继承的条件是初始化器的签名
【发布时间】:2016-07-04 20:43:55
【问题描述】:

Food 类是 RecipeIngredient 的超类。

Food 类引入了一个名为name 的变量和一个指定的初始化器init(name: String) 和一个便利初始化器init()

RecipeIngredient 类引入了一个名为 quantity 的新变量和一个指定初始化器 init(name: String, quantity: Int) 和一个便利初始化器 init(name: String)

class Food {
    var name: String
    init(name: String) {
        self.name = name
    }
    convenience init() {
        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) {
        self.init(name: name, quantity: 1)
    }
}

let oneMysteryItem = RecipeIngredient()
print("\(oneMysteryItem.name), \(oneMysteryItem.quantity)")//--> [Unnamed], 1

引用office document

尽管RecipeIngredient 提供了init(name: String) 初始化器作为便利初始化器,RecipeIngredient 仍然提供了它的所有超类的指定初始化器的实现。因此,RecipeIngredient 也自动继承了其父类的所有便利构造器。

问题1:子类RecipeIngredient的便利构造器和超类Food的指定构造器具有相同的签名,又名。 init(name: String)。但它们是完全不同的初始化器!那么,我可以说,只要子类中有一个初始化器与超类具有相同的签名,就可以认为子类提供了超类指定初始化器的含义

问题2:由于RecipeIngredient 类继承了Food 类的说服构造器。 let oneMysteryItem = RecipeIngredient() 有效。但是print("\(oneMysteryItem.name), \(oneMysteryItem.quantity)")打印出[Unnamed], 1,我真的不明白这个1是怎么来的!发生了什么?固有的便利初始化器只定义了如何初始化固有值name,这个quantity == 1是怎么定义的?

【问题讨论】:

    标签: swift inheritance initialization


    【解决方案1】:

    问题一:

    规则是,如果子类有任何指定的初始化器,并且还覆盖了其超类的所有 DESIGNATED 初始化器(在子类中将它们标记为指定的或方便的),则继承超类的 CONVENIENCE 初始化器。

    问题 2:

    RecipeIngredient 为其超类的唯一指定初始化程序(即init(name: String))提供了一个重写初始化程序,因此所有便利初始化程序都被继承(即,在这种情况下只是init())。调用RecipeIngredient() 会调用init() 便利初始化器,后者又会调用子类上的init(name: "[Unnamed]"),而后者又会调用init(name: "[Unnamed]", quantity: 1),子类的指定初始化器

    【讨论】:

      【解决方案2】:

      “继承版本的 init() 的功能与 Food 版本完全相同,只是它委托给 RecipeIngredient 版本的 init(name: String) 而不是 Food 版本。”

      来源:Initialization 在“Swift 编程语言 (Swift 3.1)”中​​。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多