【发布时间】:2015-04-01 12:46:53
【问题描述】:
我有一个名为LLLinkedList 的类,它定义了一个subscript:
class LLLinkedList<L> {
//other properties, functions and initializers...
subscript(range: Range<Int>) -> LLLinkedList {
get {
//return something
}
set {
//set something
}
}
}
现在subscript 显然接受Range<Int> 并返回LLLinkedList。
我还定义了LLLinkedList 的一个子类,称为LLArray:
class LLArray<A>: LLLinkedList<A> {
//other properties, functions and initializers...
}
LLArray 还实现了一个subscript 接受一个Range<Int> 并返回一个LLArray:
subscript(range: Range<Int>) -> LLArray {
get {
//return something
}
set {
//set something
}
}
由于LLArray 是LLLinkedList 的一种类型,因此不能覆盖子类中的subscript(因为参数和返回类型因此相同)。
如果我不覆盖下标,编译器会对我大喊:
<stdin>:1173:5: error: cannot override mutable subscript of type '(Range<Int>) -> LLArray<A>' with covariant type '(Range<Int>) -> LLLinkedList<A>'
subscript (range: Range<Int>) -> LLArray {
^
现在这个错误对我来说是有意义的,但我该如何绕过它呢?
或者我什至必须实施一个新的subscript?
我实现了一个新的subscript,以便在使用返回的实例时返回LLArray 而不是LLLinkedList,从而避免向下转换的需要。
【问题讨论】:
-
你可以覆盖
subscript,如果它是只读的(只有get,没有set)。另一方面,子类不能用更具体的 argument 类型覆盖set。
标签: class swift overriding covariance subscript