遵循可堆叠特征的规范示例[1]:
trait Double extends IntQueue {
abstract override def put(x: Int) { super.put(2 * x) }
}
如果我想要常数' 2'不合时宜地设定?
我有两个解决方案,但有很大的缺点:
将方法putMultiplied
添加到新特征MultiplyX
trait Multiplier extends IntQueue {
abstract override def putMultiplied(constant: Int, x: Int) { super.put(constant * x) }
}
然而,这会破坏stackable属性,因为另一个可堆叠的特征必须知道putMultiplied
方法
为常量设置一个setter:
trait Multiplier extends IntQueue {
var constant //hihi a variable constant
abstract override def put(x: Int) { super.put(constant * x) }
}
然而,这看起来很奇怪,并且让调用者的负担在每次调用之前都要记住设置constant
。
直观地说,我希望特征具有构造函数参数:
trait Multiplier(val constant: Int) extends IntQueue {
abstract override def put(x: Int) { super.put(constant * x) }
}
但是我们都知道特征不支持参数。
我是否在Scala特征的组合中过多地询问这种模式? 这将如何解决?
[1] http://www.artima.com/scalazine/articles/stackable_trait_pattern.html
答案 0 :(得分:1)
制作另一种方法:
trait Multiplied extends IntQueue {
def multiplier = 2
abstract override def put(x: Int) { super.put(multiplier * x) }
}
然后您可以像这样实例化它:
val triplingQueue = new ActualQueue with Multiplier {
override def multiplier = 3
}