Swift 自动初始值设定项继承';s条件是初始值设定项';签名
Swift 自动初始值设定项继承';s条件是初始值设定项';签名,swift,inheritance,initialization,Swift,Inheritance,Initialization,Food类是recipeingcredit的超类 Food类引入了一个名为name的变量和一个指定的初始值设定项init(name:String)和一个方便的初始值设定项init() RecipeIngCreditclass引入了一个名为quantity的新变量和一个指定的初始值设定项init(name:String,quantity:Int)和一个方便的初始值设定项init(name:String) 引自 尽管recipeingcredit提供了init(name:String)初始值设定项作
Food
类是recipeingcredit
的超类
Food
类引入了一个名为name
的变量和一个指定的初始值设定项init(name:String)
和一个方便的初始值设定项init()
RecipeIngCredit
class引入了一个名为quantity
的新变量和一个指定的初始值设定项init(name:String,quantity:Int)
和一个方便的初始值设定项init(name:String)
引自
尽管recipeingcredit
提供了init(name:String)
初始值设定项作为一个方便的初始值设定项,recipeingcredit
仍然提供了其所有超类指定初始值设定项的实现。因此,RecipeIngCredit
也会自动继承其超类的所有方便的初始值设定项
问题1:子类RecipeingCredit
的便利初始值设定项和超类Food
的指定初始值设定项具有相同的签名,即aka<代码>初始化(名称:字符串)。但他们是完全不同的初始化者!所以,我可以说,只要子类中有一个初始值设定项与超类具有相同的签名,就可以认为子类是提供了超类指定初始值设定项的含义的
问题2:由于接受方
类在体验了食品
类的方便初始值设定项let-oneMysteryItem=RecipeIngCredit()
有效。但是print(\(oneMysteryItem.name),\(oneMysteryItem.quantity)
prints[Unnamed],1,我真的不明白这1是怎么来的!发生了什么事?固有便利初始值设定项仅定义了如何初始化固有值名称
,该数量==1
是如何定义的?问题1:
规则是,如果子类有任何指定的初始值设定项,并且还覆盖了其超类的所有指定初始值设定项(在子类中将它们标记为指定的或方便的),则超类的方便初始值设定项将被继承
问题2:
RecipeIngCredit
提供了其超类唯一指定的初始值设定项的重写初始值设定项(即init(name:String)
),因此所有方便的初始值设定项都是继承的(即,在本例中仅继承init()
)。调用RecipeIngCredit()
调用init()
便利初始值设定项,该初始值设定项依次调用子类上的init(名称:“[未命名]”)
,子类的指定初始值设定项init(名称:“[未命名]”,数量:1)
规则是,如果子类有任何指定的初始值设定项,并且还覆盖了其超类的所有指定初始值设定项(在子类中将它们标记为指定的或方便的),则超类的方便初始值设定项将被继承
问题2:
RecipeIngCredit
提供了其超类唯一指定的初始值设定项的重写初始值设定项(即init(name:String)
),因此所有方便的初始值设定项都是继承的(即,在本例中仅继承init()
)。调用RecipeIngCredit()
调用init()
便利初始值设定项,该初始值设定项依次调用子类上的init(名称:“[未命名]”)
,该子类的指定初始值设定项调用init(名称:“[未命名]”,数量:1)
,子类的指定初始值设定项功能与食品版本完全相同,只是它委托给init(名称:String)的RecipeIncident版本,而不是食品版本。”
来源:在“Swift编程语言(Swift 3.1)”中。“init()的继承版本的功能与食品版本完全相同,只是它委托给init的ReceiveCredit版本(名称:String),而不是食品版本。” 资料来源:在“Swift编程语言(Swift 3.1)”中
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