Food
クラスはRecipeIngredient
のスーパークラスです。自動初期化子継承の条件は初期化子の署名です
Food
クラス導入された1つの変数の名前name
と1つの指定イニシャライザinit(name: String)
と利便初期化子init()
。
RecipeIngredient
クラスはRecipeIngredient
コンビニエンス初期化子としてinit(name: String)
初期化子を提供していますがoffice document
から新しい
quantity
という名前の変数と1つの指定イニシャライザ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
は、すべてのスーパークラスのde署名付き初期化子。したがって、RecipeIngredient
はスーパークラスのすべての便利な初期化子も自動的に継承します。
Question1:サブクラスRecipeIngredient
の便宜のイニシャライザと別名、同じ署名を有するFood
スーパークラスの指定イニシャライザ。 init(name: String)
。しかし、彼らは完全に異なるイニシャライザです! RecipeIngredient
以来:スーパークラスと同じシグネチャを持っているので、私が言うことができる限り、サブクラスで初期化子があるとして、それは、サブクラスがスーパークラスの指定イニシャライザ
Question2の意味を与えていると考えることができますクラスFood
クラスのconivineceイニシャライザです。 let oneMysteryItem = RecipeIngredient()
が有効です。しかしprint("\(oneMysteryItem.name), \(oneMysteryItem.quantity)")
プリント[無名]、1、私は本当にこの1から来る方法を理解していない!何がうまい?固有の便利なイニシャライザは、固有値name
の初期化方法のみを定義しましたが、これはどのように定義されていましたか?quantity == 1
?