【问题标题】:how is the subclass property "quantity" initialised子类属性“数量”是如何初始化的
【发布时间】:2016-06-30 20:26:52
【问题描述】:

我正在尝试快速学习继承和初始化的概念,并提出了以下代码。 “the swift programming language 2.1”指出,如果子类提供其所有超类指定初始化器的实现,则子类也会自动继承其所有超类便利初始化器。

因此子类“RecipeIngredient”应该继承父类“Food”的convenience init(){ self.init(name: "[unnamed]")。但是这个特别方便的init只初始化了varname,它怎么能初始化子类属性quantity呢?有人可以向我解释一下,当我使用超类convenience init(){ self.init(name: "[unnamed]") 创建子类实例时,子类属性quantity 是如何初始化的?提前感谢您的帮助!

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 ingredientOne = RecipeIngredient()
ingredientOne.name
ingredientOne.quantity

【问题讨论】:

    标签: ios swift inheritance subclass superclass


    【解决方案1】:

    当你执行时

    let ingredientOne = RecipeIngredient()
    

    方法Food.init() 运行,并调用self.init(name:String)self实际上是RecipeIngredient的一个实例,所以这个方法实际上是RecipeIngredient.init(name:String),你提供了它来初始化quantity

    可以通过在每个init 例程中添加print 语句来确认这一点,以查看哪些方法以何种顺序被调用。

    如果我注释掉方法RecipeIngredient.init(name:String),编译器将不再让我写RecipeIngredient()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-21
      • 2015-11-29
      • 2017-09-29
      • 1970-01-01
      • 2016-06-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多