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
我想知道为什么我的代码看起来合理时会有这样的限制?
答案 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