Ant*_*ron 6 generics overriding swift
这是代码:
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")
}
}
Run Code Online (Sandbox Code Playgroud)
它大喊这样的错误:
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) {
~~~~~~~~ ^
Run Code Online (Sandbox Code Playgroud)
我怎样才能覆盖超类中的方法Test<Int>?
==================额外=======================
谈到代码打击.
class Test<T> {
func foo(par : T){
print("foo")
}
}
class TestInh : Test<Int> {
override func foo(par : Int) {
print("loo")
}
}
Run Code Online (Sandbox Code Playgroud)
一切正常.不知道where声明出现时发生了什么.
当从泛型类继承非泛型类时,您应该:
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))")
}
}
Run Code Online (Sandbox Code Playgroud)
测试:
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)
Run Code Online (Sandbox Code Playgroud)
您收到错误的原因是 和 的方法签名func不同override 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")
}
}
Run Code Online (Sandbox Code Playgroud)
这应该可以解决您手头的问题。解决此问题的原因是方法签名现在相同:
func foo<S:SequenceType where S.Generator.Element == T>(par : S)
是相同的:
override func foo<S:SequenceType where S.Generator.Element == T>(par : S)
| 归档时间: |
|
| 查看次数: |
1871 次 |
| 最近记录: |