继承自IndexedSeq,但希望updated()返回子类

时间:2015-04-01 23:01:50

标签: scala inheritance

我正在使用this answer中提到的RingBuffer实现,它继承自IndexedSeq:

class RingBuffer[A](val index: Int, val data: IndexedSeq[A]) extends IndexedSeq[A] {
  def shiftLeft = new RingBuffer((index + 1) % data.size, data)
  def shiftRight = new RingBuffer((index + data.size - 1) % data.size, data)
  def length = data.length
  def apply(i: Int) = data((index + i) % data.size)
}

我希望能够做到的是:

var rb = new RingBuffer(0, IndexedSeq(1, 2, 3))
rb = rb.updated(0, 4).shiftLeft

...但更新后返回一个IndexedSeq。

我应该覆盖RingBuffer实现中的更新吗?或者我应该采取不同的方法吗?

1 个答案:

答案 0 :(得分:0)

我相信你需要在隐式范围内拥有一个CanBuildFrom的RingBuffer。如果您查看Scaladocupdated的完整签名,您会看到CanBuildFrom的使用位置:

def updated[B >: A, That](index: Int, elem: B)
                         (implicit bf: CanBuildFrom[IndexedSeq[A], B, That])
                         : That

我建议在Scala 2.8 breakOut阅读Daniel Sobral的论文了解更多细节。

一般来说,我发现继承大多数集合库类是一个错误,或者至少比它看起来要困难得多。