当我写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帖子,但我无法解决这个问题。
谢谢!
答案 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") }
}
代码同时编译并打印子级。