【发布时间】:2016-06-30 22:59:06
【问题描述】:
根据“Swift 编程语言 2.1”,如果子类为其所有属性提供默认值,则子类自动继承其所有超类的指定初始化器和便利初始化器。所以对于下面的代码,类ShoppingListItem应该从它的超类RecipeIngredient继承三个初始化器,即
//1
convenience init() {
self.init(name: "[unnamed]")
}
//2
convenience init(name: String){
self.init(name: name, quantity: 1)
}
//3
init(name: String, quantity: Int){
self.quantity = quantity
super.init(name: name)
}
如果我想创建一个 ShoppingListItem 的实例,我会写
let ingredientThree = ShoppingListItem(name: "apple", quantity: 10)
这将调用init(name: String, quantity: Int){},但在这个初始化程序中,有一个对super.init(name: name) 的调用,这就是我卡住的地方。当初始化过程达到super.init(name: name) 时会发生什么?它是否调用ShoppingListItem 的超类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)
}
}
class ShoppingListItem: RecipeIngredient {
var purchased = false
var description: String {
var output = "\(quantity) X \(name)"
output += purchased ? " ✔" : " ✘"
return output
}
}
【问题讨论】:
-
有时当我看到来自 Apple 文档的示例代码时,我想去库比蒂诺并给他们的作者一巴掌:ShoppingListItem 不是一种成分——它有一种成分。它应该被建模为组合,而不是继承。一种成分有一种食物:又是成分。
标签: ios swift initialization subclass superclass