gpt4 book ai didi

class - 在子类中覆盖返回协变类型的下标

转载 作者:搜寻专家 更新时间:2023-10-31 22:51:06 25 4
gpt4 key购买 nike

我有一个类叫做 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
}
}

LLArrayLLLinkedList 的一种不能覆盖 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 ,从而在处理返回的实例时避免了向下转换的需要。

最佳答案

基本上,没有办法用读/写下标做你想做的事情,因为下标的返回类型实际上出现在 LLLinkedList 类的协变和逆变位置( get 部分下标将其置于协变位置;set 部分置于逆变位置)。因此它不能在子类中改变,因为它会破坏替换原则。再多的协议(protocol)和扩展也无法修复它(如果可以,那就是编译器错误)。

这里的一种可能性是将下标拆分为两个方法:getter 方法可以具有协变返回类型,而 setter 方法仍将始终接受更通用的 LLLinkedList 类型。

关于class - 在子类中覆盖返回协变类型的下标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28280001/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com