如何在swift中覆盖泛型类中的泛型方法?

时间:2016-07-14 12:08:21

标签: swift generics override

我快速学习。 我想覆盖泛型类中的泛型函数。

当我写override个关键字时,会发生编译错误。

class GenericParent<U> {
    func genericFunc<T>(param: T) { print("parent") }
}

class AbsoluteChild: GenericParent<Int> {
    override func genericFunc<T>(param: T) { print("child") }
    // ! Method does not override any method from its superclass (compile error)
}

我可以省略override个关键字。 但是当我将对象类型声明为“Parent”时,将调用父方法(而不是子方法)。它不是字面上的“压倒性”。

class GenericParent<U> {
    func genericFunc<T>(param: T) { print("parent") }
}

class AbsoluteChild: GenericParent<Int> {
    func genericFunc<T>(param: T) { print("child") }
}

var object: GenericParent<Int>
object = AbsoluteChild()
object.genericFunc(1) // print "parent" not "child"

// I can call child's method by casting, but in my developing app, I can't know the type to cast.
(object as! AbsoluteChild).genericFunc(1) // print "child"

在这个例子中,我希望object.genericFunc(1)得到“孩子”。 (换句话说,我想“覆盖”该方法。)

我怎么能得到这个?是否有任何解决方法可以实现这一目标?

我知道我可以通过施法调用孩子的方法。但是在我正在开发的实际应用中,我无法知道要播放的类型,因为我想让它变成多态。

我也看了Overriding generic function error in swift帖子,但我无法解决这个问题。

谢谢!

1 个答案:

答案 0 :(得分:1)

此问题已在Swift 5中解决:

class GenericParent<U> {
    func genericFunc<T>(param: T) { print("parent") }
}

class AbsoluteChild: GenericParent<Int> {
    func genericFunc<T>(param: T) { print("child") }
}

var object: GenericParent<Int>
object = AbsoluteChild()
object.genericFunc(1) // print "parent" not "child"

// I can call child's method by casting, but in my developing app, I can't know the type to cast.
(object as! AbsoluteChild).genericFunc(1) // print "child"

现在触发错误:

  

覆盖声明需要一个'override'关键字

与:

class AbsoluteChild: GenericParent<Int> {
    override func genericFunc<T>(_ param: T) { print("child") }
}

代码同时编译并打印子级。