我正在 Swift 中扩展一个基类(我无法控制的基类)。我想提供一个类函数来创建一个类型为子类的实例。需要通用函数。但是,像下面这样的实现不会返回预期的子类类型。
class Calculator {
func showKind() { println("regular") }
}
class ScientificCalculator: Calculator {
let model: String = "HP-15C"
override func showKind() { println("scientific") }
}
extension Calculator {
class func create<T:Calculator>() -> T {
let instance = T()
return instance
}
}
let sci: ScientificCalculator = ScientificCalculator.create()
sci.showKind()
调试器将 T
报告为 ScientificCalculator
,但 sci
是 Calculator
并调用 sci.showKind ()
返回“常规”。
有没有一种方法可以使用泛型来达到预期的结果,或者这是一个错误?
最佳答案
好的,来自 developer forums ,如果您可以控制基类,则可以实现以下解决方法。
class Calculator {
func showKind() { println("regular") }
required init() {}
}
class ScientificCalculator: Calculator {
let model: String = "HP-15C"
override func showKind() { println("\(model) - Scientific") }
required init() {
super.init()
}
}
extension Calculator {
class func create<T:Calculator>() -> T {
let klass: T.Type = T.self
return klass()
}
}
let sci:ScientificCalculator = ScientificCalculator.create()
sci.showKind()
不幸的是,如果您无法控制基类,则无法使用这种方法。
关于inheritance - 是否可以将 Swift 泛型类函数返回类型限制为同一个类或子类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27336607/