覆盖swift中的泛型函数错误

时间:2016-01-04 06:19:51

标签: swift generics override

以下是代码:

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<Int>中的方法?

==================附加=======================

谈到代码打击。

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

一切正常。不知道where陈述出现的情况。

2 个答案:

答案 0 :(得分:3)

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

  • override - 通用方法一起使用;但
  • 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)

答案 1 :(得分:1)

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

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

不一样:

override func foo<S:SequenceType where S.Generator.Element == Int>(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<S:SequenceType where S.Generator.Element == T>(par : S)

与:

相同

override func foo<S:SequenceType where S.Generator.Element == T>(par : S)