如何在超类中创建一个方法创建子类对象?

时间:2015-05-14 20:32:56

标签: swift inheritance

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对象?

1 个答案:

答案 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,否则上述任何一个都不会编译。