【发布时间】: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
尽管
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