以下是代码:
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
陈述出现的情况。
答案 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)
您收到错误的原因是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")
}
}
这应该可以解决您手头的问题。这解决的原因是方法签名现在是相同的:
func foo<S:SequenceType where S.Generator.Element == T>(par : S)
与:
相同 override func foo<S:SequenceType where S.Generator.Element == T>(par : S)