Scala - 如何实现函数返回this.type与其他实现维度

时间:2014-05-17 11:40:49

标签: scala oop generics types polymorphism

这是场景。我想实现一个带有类型成员的类,例如,类型为E的元素的列表。在这个类中,我们有一个根据参数创建新列表的方法,我们有两个实现,BigList和SmallList。

一切看起来都不错。但是,我仍然希望在类型E上专门化一些实现。例如,我们有IntList,并且还有一些操作。这是问题所在。

当我尝试在IntList中使用take时,我希望得到一个IntList而不是List [Int],有点像它返回魔法this.type。假设BigList和SmallList实现独立于类型E的值,这意味着如果我在IntList中重写方法take,它将是相同的,除了返回类型,我不想复制那个实现。我知道BigList和SmallList本身并不是IntList,但我在建模时遇到了麻烦,也许这不是正确的方法,这只是展示用例的一个例子。一种可能性是使用像BigList[E, This <: BigList[E, This]]这样的f-bounded多态,BigList可以表示各种List,IntList等。但是我没有让它发挥作用,而且它很复杂。

实现这一目标的理想方法是什么?

class List[E](val head: E, val tail: List[E]) {
  def take(n: Int): List[E] = {
    if (n < 5) new SmallList[E](this.head, tail.take(n - 1))
    else new BigList[E](this.head, tail.take(n - 1))
  }
}

class BigList[E](head: E, tail: List[E]) extends List[E](head, tail) {
  ...
}

class SmallList[E](head: E, tail: List[E]) extends List[E](head, tail) {
  ...
}

class IntList(head: Int, tail: List[Int]) extends List[Int](head, tail) {
  def intSum: Int = ...

  def take(x: Int): IntList = {
    if (n < 5) new SmallList[E](this.head, tail.take(n - 1))
    else new BigList[E](this.head, tail.take(n - 1))
  }
}

0 个答案:

没有答案