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