2017-05-17 2 views
1

のパラメータとして形質を使ってI次のコードを持っている:はケースクラス

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

copy()メソッドは、ケースクラスに対して定義され、特性に対しては定義されていません。 特性はプレーンクラスでも実装できるため、trait Vehicleのすべての実装にcopyメソッドがあるという保証はありません。

あなたは今、二つの選択肢

  • は、車両の形質に方法withUpdatedSpeed(speed): Vehicleを追加しているので、各サブクラスはx.vehicleに実装

  • やケースの一致を提供し、手動で車両のインスタンスを構築します。

+0

これはこれに対する私の正確な解決策でした。しかし、私はそれがすべて間違っているように感じ、それを行うよりエレガントな方法が必要です。他のオプションはありますか? – Tomer

+1

シェイプレスライブラリはこれをサポートしていますが、私はそれに精通していません。このリンクに従うことができますhttp://www.cakesolutions.net/teamblogs/copying-sealed-trait-instances-a-journey-through-generic-programming-and-shapeless –

関連する問題