【发布时间】:2016-11-17 08:21:40
【问题描述】:
我学得很快。 我想覆盖泛型类中的泛型函数。
当我写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 关键字。
但是当我将对象类型声明为“父”时,会调用父方法(而不是子方法)。这不是字面上的“压倒一切”。
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) 的结果。
(换句话说,我想“覆盖”该方法。)
我怎样才能得到这个?是否有任何解决方法可以实现这一目标?
我知道我可以通过强制转换来调用 child 的方法。但是在我正在开发的实际应用程序中,我不知道要转换的类型,因为我想让它成为多态的。
我也看过Overriding generic function error in swift的帖子,但我无法解决这个问题。
谢谢!
【问题讨论】:
-
说
object是GenericParent<Int>只是告诉编译器哪些方法和属性可用。它不会将类从AbsoluteChild更改为GenericParent<Int>。GenericParent<Int>使genericFunc方法可用,但object仍然是AbsoluteChild;这意味着当您调用genericFunc时,它将调用孩子的实现。您不能将对象强制转换为其父类以获取父类的实现。 -
谢谢!但是当我在操场上执行第二个示例时,
object.genericFunc(1)会打印“父级”。这意味着调用父级的实现。我怎么理解这个? -
哦,我也看到了。这似乎是一个错误。您可以将其作为错误提交给bugreport.apple.com 或Swift GitHub page
-
此问题可能与以下问题相同。 bugs.swift.org/browse/SR-103
-
由于 T 是通用的,编译器不知道它必须为哪种类型覆盖函数。我会排除某种“关联类型”,但不幸的是这里没有计算机来测试我的想法。
标签: swift generics overriding