class Car {
func upgrade() -> Car {
return Car()
}
}
class RacingCar : Car {
}
let racingCar = RacingCar()
let upgradedRacingCar = racingCar.upgrade()
// ideally upgradedRacingCar should be a RacingCar
如果在一个子类上调用而没有在RacingCar中实现它,如何使升级方法创建RacingCar对象?
答案 0 :(得分:5)
喜欢这个。如果是类方法:
class Car {
class func upgrade() -> Self {
return self()
}
}
如果是实例方法:
class Car {
func upgrade() -> Self {
return self.dynamicType()
}
}
返回类型Self
表示“我的类,多态”。所以如果这是Car和RacingCar,我们会返回一辆Car,如果这是RacingCar的话。表示法self()
和self.dynamicType()
是调用init
的简写;这些都是类,所以这是合法的。我认为你会有一个更精细的初始化器。您必须使初始化程序required
平息编译器的恐惧(正如我解释here);因此,除非init()
在Car中标记为required
,否则上述任何一个都不会编译。