inheritance - 是否可以将 Swift 泛型类函数返回类型限制为同一个类或子类?

标签 inheritance swift polymorphism generics

我正在 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,但 sciCalculator 并调用 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/

相关文章:

ios - 自定义 View - self.frame 不正确?

.net - 我可以使用 VB.NET 覆盖类中声明的变量吗?

c++ - MFC::使用结构传递数据

ios - "Ambiguous reference to member ' init(...)"调用基类初始化器

javascript - 如何从 JSON 继承获取 JavaScript 对象?

ios - UIBezierPath 动画的奇怪问题

swift - 如何快速实现自定义运算符 []

java - java中继承的缺点

c# - 有没有 .NET 多态数据框架

c# - 是否可以从基类构造函数创建派生类?