【问题标题】:Overriding generic function error in swift快速覆盖通用函数错误
【发布时间】:2016-01-04 06:19:51
【问题描述】:

代码如下:

class Test<T> { 
    func foo<S:SequenceType where S.Generator.Element == T>(par : S){
        print("foo")
    }
}
class TestInh : Test<Int> { 
    override func foo<S:SequenceType where S.Generator.Element == Int>(par : S) { 
        print("loo")
    } 
}

它会大喊这样的错误:

repl.swift:8:19: error: method does not override any method from its superclass
    override func foo<S:SequenceType where S.Generator.Element == Int>(par : S) {
    ~~~~~~~~      ^

如何覆盖超类Test&lt;Int&gt; 中的方法?

===================补充========================

当涉及到代码攻击时。

class Test<T> { 
    func foo(par : T){
        print("foo")
    }
}
class TestInh : Test<Int> { 
    override func foo(par : Int) { 
        print("loo")
    } 
}

一切正常。不知道where 语句出现时发生了什么。

【问题讨论】:

  • 有人说这两个函数签名是不同的。但底部代码编译!!!这真的让我很困惑。即使在指定 T 之后,他们的签名也应该被认为是不同的!

标签: swift generics overriding


【解决方案1】:

从泛型类继承非泛型类时,您应该:

  • override-泛型方法一起使用;但是
  • 使用 no override 和通用的。

在这两种情况下,您仍然可以调用上述方法的super 实现。

因此,这应该有效:

class Base<T> {
    func testGeneric<S: SequenceType where S.Generator.Element == T>(sequence: S) {
        print("Base \(__FUNCTION__)(sequence: \(sequence.dynamicType))")
    }

    func testNongeneric(element: T) {
        print("Base \(__FUNCTION__)(element: \(element.dynamicType))")
    }
}

class Subclass: Base<Int> {
    func testGeneric<S: SequenceType where S.Generator.Element == Int>(sequence: S) {
        super.testGeneric(sequence)
        print("Subclass \(__FUNCTION__)(sequence: \(sequence.dynamicType))")
    }

    override func testNongeneric(element: Int) {
        super.testNongeneric(element)
        print("Subclass \(__FUNCTION__)(element: \(element.dynamicType))")
    }
}

测试:

let base = Base<Double>()
let subclass = Subclass()

base.testGeneric([])        // Prints: Base testGeneric(sequence: Array<Double>)
subclass.testGeneric([])    // Prints: Base testGeneric(sequence: Array<Int>)
                            //         Subclass testGeneric(sequence: Array<Int>)

base.testNongeneric(0)      // Prints: Base testNongeneric(element: Double)
subclass.testNongeneric(0)  // Prints: Base testNongeneric(element: Int)
                            //         Subclass testNongeneric(element: Int)

【讨论】:

  • 最后的声明让我明白了。为什么 swift 编译器没有检测到泛型方法正在覆盖其超类的方法?为什么 override 关键字在这里不起作用?
【解决方案2】:

您收到错误的原因是funcoverride func 的方法签名不同:

func foo&lt;S:SequenceType where S.Generator.Element == T&gt;(par : S)

不等于:

override func foo&lt;S:SequenceType where S.Generator.Element == Int&gt;(par : S)

如果在这种情况下继承对您很重要,那么您需要将您的子类设置为具有泛型类型声明T 的泛型实体,并修改您的override func

class Test<T> {

  func foo<S:SequenceType where S.Generator.Element == T>(par : S) {
    print("foo")
  }
}

class TestInh<T> : Test<T> {

  override func foo<S:SequenceType where S.Generator.Element == T>(par : S) {
    print("loo")
  }
}

这应该可以解决您手头的问题。这解决的原因是方法签名现在是相同的:

func foo&lt;S:SequenceType where S.Generator.Element == T&gt;(par : S)

等同于:

override func foo&lt;S:SequenceType where S.Generator.Element == T&gt;(par : S)

【讨论】:

  • 为什么两个函数不一样?我已将T 指定为Int。另外,如果TInt不同,不管我是否指定,为什么第二段代码可以正常工作?
  • 您已将T 指定为Int 类型,但这并不会改变方法签名本身不同的事实。 where S.Generator.Element == T != where S.Generator.Element == Int。为了让编译器“看到”覆盖,签名需要相同。
  • 你能解释一下我上次评论中的第二个问题吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-23
  • 2023-03-26
  • 1970-01-01
相关资源
最近更新 更多