【发布时间】:2015-03-15 21:09:13
【问题描述】:
我创建了一个旨在用作“抽象类”的类(仅用于子类化,不直接实例化)。由于 Swift 不支持这一点,因此必须使用例如抽象方法体中的致命错误。
我的抽象类必须是等价的。所以我想,我在 equals 方法中使用了 fatalError:
class MySuperClass:Equatable {
}
func ==(lhs: MySuperClass, rhs: MySuperClass) -> Bool {
fatalError("Must override")
}
class MySubClass:MySuperClass {
let id:Int
init(_ id:Int) {
self.id = id
}
}
func ==(lhs: MySubClass, rhs: MySubClass) -> Bool {
return lhs.id == rhs.id
}
let a = MySubClass(1)
let b = MySubClass(2)
let c = MySubClass(2)
a == b
b == c
这很有效。虽然我的子类有一个类型参数,但我有一个小问题。现在示例如下所示:
class MySuperClass:Equatable {
}
func ==(lhs: MySuperClass, rhs: MySuperClass) -> Bool {
fatalError("Must override")
}
class MySubClass<T>:MySuperClass {
let id:Int
init(_ id:Int) {
self.id = id
}
}
func ==<T>(lhs: MySubClass<T>, rhs: MySubClass<T>) -> Bool {
return lhs.id == rhs.id
}
let a = MySubClass<Any>(1)
let b = MySubClass<Any>(2)
let c = MySubClass<Any>(2)
a == b
b == c
现在它崩溃了,因为它没有“看到”覆盖的 equals,它只执行超类中的 equals。
我知道 Swift 在使用泛型类型的覆盖方面存在一些问题。我认为这仅限于与 obj-c 的交互。这至少看起来像是语言缺陷或错误,如果 B 是 A 的子类,为什么泛型 B 类的 equals 不会覆盖 A 类的 equals?
【问题讨论】:
-
抱歉,我最初误读了这个问题——这不是 stackoverflow.com/q/28793218/3925941 的欺骗,因为你问的是重载和泛型而不是动态调度。尽管该问题中涵盖的大部分内容也适用于平等和继承层次结构。