使用特征作为案例类的参数

时间:2017-05-17 13:13:21

标签: scala

我有以下代码:

trait Vehicle{
   val speed:Int
}

case class Car(speed: Int, color: String) extends Vehicle
case class Plane(speed: Int, numberOfEngines: Int) extends Vehicle

case class Storage(vehicle: Vehicle, size:Int)

当使用特征作为案例类的命名参数之一时,我失去了案例类的好处,例如复制方法。

所以,如果我想更新这样的车速:

val x = Storage(Car(100, "red"), 10)
x.copy(vehicle = x.vehicle.copy(speed = 30)) //this will not work.

这很明显。 事情是看起来这里的设计很糟糕,这就是为什么我以这个问题结束了。

有更好的方法对此进行建模吗?

1 个答案:

答案 0 :(得分:1)

$ dehumanise 1000MiB 19Ki 1048576000 19456 方法是针对案例类而不是针对特征定义的。 由于特征也可​​以由普通类实现,因此无法保证copy()的所有实现都具有复制方法。

您现在有两个选项

  • 向Vehicle trait添加方法trait Vehicle,因此每个subClass都将提供一个实现

  • 或x.vehicle上的案例匹配并手动构建车辆实例。