免责声明:这个问题不是关于我是否应该这样做,或者它是否是一个好的设计,也不是任何相关的推理。问题是我如何做到这一点。我稍后解释原因只是为了澄清。
我可以参数化Scala特征吗?我知道它们不能有构造函数参数-有其他方法吗?例如(当然,这只是一个例子)
case class MyMachine(myDouble: Double) {
def methodEveryMachineHas(): Double = 2 * myDouble
}
trait Drivable {
this: MyMachine =>
def drive(x: Double): Double = HowToDriveFunction(x) * myDouble
}
object HowToDriveFunction extends (Double => Double) {
def apply(x:Double): Double = x + 6.0
}
val myMachine1 = new MyMachine(3.0)
myMachine1.methodEveryMachineHas // 6.0
myMachine1.drive(4.0) // error
val myMachine2 = new MyMachine(3.0) with Drivable
myClass1.methodEveryMachineHas // 6.0
myClass1.drive(4.0) // 30.0 = (4.0 + 6.0) * 3.0
我怎么通过
HowToDriveFunction
到
drive
?
为什么我想要这个
将逻辑上不同的事物表示为编程上不同的东西,从而生成有意义的代码
函数应该固定锚定在对象(=实例化类)本身中。因此,我希望它在创造过程中给出。然而,并非全部
MyMachine
他们应该有驾驶能力。
想象
成为一台机器,以及
Drivable
如何驱动函数
)这种特定机器(可能是汽车或飞机)的驱动方式。然而,为什么我要解释每台机器如何驾驶?这毫无意义。我只想向那些会开车的人解释。因此,我想给予
如何驱动函数
这意味着机器可以驾驶,因此首先应该能够驾驶。
怎样
当然,我的实际工作与机器无关,这只是一个例子。
trait HowToDriveFunction {
this: Drivable =>
???
}
确保只有那些
可驾驶
如何驱动函数
,但在我看来,这并不是那么漂亮,原因已经解释清楚了。
以下是“继承之上的组合”
最后但并非最不重要的一点,我认为拥有它很好
composition over inheritance