【问题标题】:How to override generic method in generic class in swift?如何快速覆盖泛型类中的泛型方法?
【发布时间】: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的帖子,但我无法解决这个问题。

谢谢!

【问题讨论】:

  • objectGenericParent&lt;Int&gt; 只是告诉编译器哪些方法和属性可用。它不会将类从 AbsoluteChild 更改为 GenericParent&lt;Int&gt;GenericParent&lt;Int&gt; 使genericFunc 方法可用,但object 仍然是AbsoluteChild;这意味着当您调用genericFunc 时,它将调用孩子的实现。您不能将对象强制转换为其父类以获取父类的实现。
  • 谢谢!但是当我在操场上执行第二个示例时,object.genericFunc(1) 会打印“父级”。这意味着调用父级的实现。我怎么理解这个?
  • 哦,我也看到了。这似乎是一个错误。您可以将其作为错误提交给bugreport.apple.comSwift GitHub page
  • 此问题可能与以下问题相同。 bugs.swift.org/browse/SR-103
  • 由于 T 是通用的,编译器不知道它必须为哪种类型覆盖函数。我会排除某种“关联类型”,但不幸的是这里没有计算机来测试我的想法。

标签: swift generics overriding


【解决方案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"

现在触发错误:

覆盖声明需要一个“覆盖”关键字

与:

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

代码编译并打印 child。

【讨论】:

    猜你喜欢
    • 2012-03-01
    • 2020-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-20
    • 2013-04-04
    相关资源
    最近更新 更多