为什么我们不能两次混合特质?

时间:2014-07-02 03:40:40

标签: scala inheritance traits

Scala代码:

trait Box {
  def put(num:Int) = println("Put number: " + num)
}

trait DoubleBox extends Box {
  override def put(num:Int) = super.put(2*num)
}

object MyBox extends Box with DoubleBox

MyBox.put(3)

工作正常并打印6

但是当我尝试时:

object MyBox extends Box with DoubleBox with DoubleBox

无法编译:

error: trait DoubleBox is inherited twice

我想知道为什么我的代码看起来合理时会有这样的限制?

1 个答案:

答案 0 :(得分:5)

您尝试使用特征,就好像它们是功能组合一样。这不是一个先验不合理的想法,但这并不是特质如何发挥作用。特征是你拥有或不具备的特征,而不是零或更多的列表。

如果您需要功能组合,请构建一个函数并组合它们。

trait Box { def put(num: Int) { println("Put "+num) } }
trait FunctionBox extends Box { self =>
  def fn: (Int => Int)
  def andThen(fb: FunctionBox) = new FunctionBox {
    def fn = self.fn andThen fb.fn
  }
  override def put(num: Int) { super.put(fn(num)) }
}
object DoubleBox extends FunctionBox {
  val fn = (x: Int) => 2*x
}
val MyBox = DoubleBox andThen DoubleBox