【发布时间】:2021-08-22 04:40:10
【问题描述】:
public class AnyEquatable: Equatable {
public let value: Any
private let equals: (Any) -> Bool
public init<E: Equatable>(_ value: E) {
self.value = value
self.equals = { $0 as? E == value }
}
public static func == (lhs: AnyEquatable, rhs: AnyEquatable) -> Bool {
lhs.equals(rhs.value) || rhs.equals(lhs.value)
}
}
public class AnyComparable: AnyEquatable, Comparable {
private let compares: (Any) -> Bool
public init<C: Comparable>(_ value: C) {
super.init(value)
self.compares = { ($0 as? C).map { $0 < value } ?? false }
}
public static func < (lhs: AnyComparable, rhs: AnyComparable) -> Bool {
lhs.compares(rhs.value) || rhs.compares(lhs.value)
}
}
我有一个错误:
重写方法“init”具有通用签名 C,其中 C: Comparable 与基本方法的通用签名不兼容 E 其中 E:等式;预期的通用签名为 C 其中 C: 平等的
为什么编译器认为我覆盖了初始化程序?我没有使用“覆盖”这个词。我不能在这里覆盖,因为方法“init”具有不同的签名(编译器告诉自己)。它不是压倒一切的。我希望子类使用自己的初始化程序,而且我(显然)不想继承超类初始化程序。
那么,我该如何实现呢?有什么比继承自平等的东西更自然的了!为什么我不能这样做?
【问题讨论】:
-
@LeoDabus 我从这里得到的主要思想:stackoverflow.com/a/46288607/2167345
-
尽量不要继承 AnyEquatable。
class AnyComparable: Comparable & Equatable { -
顺便说一句,您希望如何对不同类型进行排序?如果它们相等,为什么需要检查不同的类型?
-
派生类中的init实际上是一个override。签名是“不兼容的”,因为如果允许它会违反“Liskov 替换原则”。
标签: swift inheritance initialization