2016-07-04 5 views
0

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

答えて

1

質問1:

ルールは、サブクラスが何らかの指定された初期化子を持っており、またそのスーパークラスの指定イニシャライザ(指定されたとして、またはサブクラスで利便性のいずれかとして、それらをマーキング)のALL、の利便性の初期化子をオーバーライドする場合は、ということですスーパークラスは継承されます。

質問2:

RecipeIngredientするため、すべての便利な初期化子が継承され、そのスーパークラスの唯一の指定イニシャライザ(すなわち、init(name: String))のオーバーライドされた初期化子を提供している(すなわち、この場合だけinit()に)。 RecipeIngredient()を呼び出すと、順番に順番にinit(name: "[Unnamed]", quantity: 1)、サブクラス

1

「のinitの継承されたバージョン()フードバージョンとまったく同じように機能の指定イニシャライザを呼び出し、サブクラス、上init(name: "[Unnamed]")を呼び出しinit()コンビニエンス初期化子を呼び出しますただし、それはFoodバージョンではなく、RecipeIngredientバージョンのinit(name:String)に委譲されます。

出典:Initialization「The Swift Programming Language(Swift 3.1)」。

関連する問題