我正在学习Swift编程语言的以下章节:
如果您的子类没有定义任何指定的初始值设定项,它会自动继承其所有超类指定的初始值设定项。
然后我在目标中尝试了这些代码:
class Car {
var name: String = "Unknown"
init(name: String) {
self.name = name
}
}
class RacingCar: Car {
var speed = 0.0
init(name: String, speed: Double) {
self.speed = speed
super.init(name: name)//this is where I got confused
}
}
根据规则一,RacingCar类不会从其超类Car继承init(name :)指定的初始化程序。但是,我仍然能够在我的子类中调用super.init(name :)。怎么会发生这种情况?我对此很困惑。有谁能解释为什么?感谢。
答案 0 :(得分:3)
继承初始化程序意味着该初始化程序可用于子类的实例(这就是继承的含义);也就是说,您的子类'初始值设定项可以在self
上调用它:
class RacingCar: Car {
var speed = 0.0
init(name: String, speed: Double) {
self.speed = speed
self.init(name: name) // <-- Error: This initializer is not inherited
}
}
你不需要继承一个初始值设定项来在super
上调用它:超类不会因为你的子类化它而失去对它的初始化程序的访问权。
class RacingCar: Car {
var speed = 0.0
init(name: String, speed: Double) {
self.speed = speed
super.init(name: name) // <-- Works: super class does have this initializer
}
}