我正在学习Swift编程语言。
我想要在泛型类中重载泛型函数。
当我使用"override"关键字时,编译错误会发生。
在这个例子中,我希望通过
如何实现这一点呢?有没有什么变通方法可以做到这一点?
我知道我可以通过转型来调用子类的方法。但是在我正在开发的实际应用程序中,我不知道要转型的类型,因为我想让它具有多态性。
我也阅读了Overriding generic function error in swift的文章,但是我无法解决这个问题。
谢谢!
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)
来获得“child”作为结果。(换句话说,我想要“覆盖”这个方法。)如何实现这一点呢?有没有什么变通方法可以做到这一点?
我知道我可以通过转型来调用子类的方法。但是在我正在开发的实际应用程序中,我不知道要转型的类型,因为我想让它具有多态性。
我也阅读了Overriding generic function error in swift的文章,但是我无法解决这个问题。
谢谢!
object
是一个GenericParent<Int>
只是告诉编译器有哪些方法和属性可用。它并不会将类从AbsoluteChild
更改为GenericParent<Int>
。GenericParent<Int>
使得genericFunc
方法可用,但object
仍然是一个AbsoluteChild
;这意味着当你调用genericFunc
时,它将调用子类的实现。你不能将对象强制转换为其父类以获取父类的实现。 - keithbhunterobject.genericFunc(1)
打印出“parent”。这意味着调用了父类的实现。我该如何理解这个问题? - Yoshikuni Kato