在swift中覆盖泛型函数错误 [英] Overriding generic function error in swift

查看:188
本文介绍了在swift中覆盖泛型函数错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

下面是代码:

  class Test< T> {
func foo< S:SequenceType其中S.Generator.Element == T>(par:S){
print(foo)
}
}
class TestInh:Test< Int> {
覆盖func foo< S:SequenceType其中S.Generator.Element == Int>(par:S){
print(loo)
}
}

它会大声说出这样的错误:

  repl.swift:8:19:error:方法不覆盖其超类中的任何方法
覆盖func foo< S:SequenceType其中S.Generator.Element == Int>(par: S){
~~~~~~~~ ^

如何覆盖方法在超类 Test< Int>



============= =====额外=======================



说到代码打击。

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

一切正常。不知道发生在其中语句出现的情况。

解决方案

当继承您应该:


  • 使用覆盖 - 泛型方法;但

  • 使用 no 覆盖与通用的。

>

在这两种情况下,您仍然可以调用 super 执行所述方法。


$ b $因此,这应该工作:

  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)))
}
}

类子类:Base< Int> {
func testGeneric< S:SequenceType其中S.Generator.Element == Int>(sequence:S){
super.testGeneric(sequence)
print(Subclass \(__ FUNCTION__) (sequence:\(sequence.dynamicType)))
}

覆盖func testNongeneric(element:Int){
super.testNongeneric(element)
print (Subclass \(__ FUNCTION __)(element:\(element.dynamicType)))
}
}

测试:

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

base.testGeneric([])//打印:Base testGeneric(sequence:Array< Double>)
subclass.testGeneric([])//打印:Base testGeneric(sequence:Array< Int>)
//子类testGeneric(sequence:Array< Int>)

base.testNongeneric(0)// Prints:Base testNongeneric(element:Double)
subclass.testNongeneric(0)//打印:Base testNongeneric(element:Int)
//子类testNongeneric(元素:Int)


Here's the code:

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")
    } 
}

And it yells such error:

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) {
    ~~~~~~~~      ^

How could I override the method in super class Test<Int>?

==================additional=======================

When it comes to the code blow.

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

Everything works fine. Not knowing what happened on where statement's appearing.

解决方案

When inheriting a non-generic class from a generic one, you should:

  • Use override with non-generic methods; but
  • Use no override with generic ones.

In both cases you can still call super implementation of the said method.

Therefore, this should work:

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))")
    }
}

Test:

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中覆盖泛型函数错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆