Swift继承v.s调用超级

时间:2016-03-10 03:27:01

标签: swift inheritance super initializer

我正在学习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 :)。怎么会发生这种情况?我对此很困惑。有谁能解释为什么?感谢。

1 个答案:

答案 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
    }
}