2017-12-18 6 views
0

私はこのScalaの問題に関してあなたの助けが必要です。キャストせずにScalaのテストでprivate varsにアクセス

私はクラスの階層を持っています:すべての車両の共通変数のみを持ち、次に3つのサブクラス:車、トラック、MotorCycleを持つ車両です。私はそれをテストする必要がある場合

object Transformation { 
    def someTransformation(vehicle:Vehicle):Vehicle = { 
     vehicle match { 
      case Car(<<<vars>>>) => Car(<<< transformed vars>>>) 
      case Truck(<<<vars>>>) => Truck(<<< transformed vars>>>) 
      case MotorCycle(<<<vars>>>) => MotorCycle(<<< transformed vars>>>) 
     } 
    } 
} 

私の問題は、私は(車を返却していては、ミックスインを言うことができます、次のとおりです。 私は車両の種類に依存し、いくつかの変換を行うために補助オブジェクトメソッドでパターンマッチングを使用しています)、私は関与している車両のプライベートvarsにアクセスするために表示されるたびにキャストする必要があります。 私はこのコードをそのまま残し、テストではキャスティングなしでプライベートメンバーにアクセスします。私がparamとして受け取った車両は、私が返す車両と同じタイプであることを知っています。 これはジェネリックで対応できますか?

よろしくお願いいたします。

+0

私はあなたが本当にちょうどサブクラス特異的、 'クラスのprivate'メンバーを意味するものではありません推測していますか? – Kraylog

+0

Nimrod Argov –

答えて

1

私がしたいことは、関数someTransformationの戻り値の型を制限することだと思います。 someTransformationは、呼び出された車両の種類のみを返すようにします。ここで

を使用すると、コンテキスト境界でこれを行うことができます方法は次のとおりです。

trait Vehicle 
case class Car(a: Int) extends Vehicle 
case class Truck(b: Int) with Vehicle 
case class MotorCycle(c: Int) with Vehicle 

object Transformation { 
    trait Transformer[V <: Vehicle] { 
    def transform(v: V): V 
    } 

    implicit val carTransformer = new Transformer[Car] { 
    override def transform(c: Car): Car = Car(c.a + 1) 
    } 

    implicit val truckTransformer = new Transformer[Truck] { 
    override def transform(t: Truck): Truck = Truck(t.b + 10) 
    } 

    implicit val motorCycleTransformer = new Transformer[MotorCycle] { 
    override def transform(m: MotorCycle): MotorCycle = MotorCycle(m.c + 100) 
    } 

    def someTransformation[V <: Vehicle : Transformer](v: V): V = { 
    implicitly[Transformer[V]].transform(v) 
    } 
} 

Transformation.someTransformation(Car(1)) // results in Car(2) 
Transformation.someTransformation(Truck(1)) // results in Truck(11) 
Transformation.someTransformation(MotorCycle(1)) // results in MotorCycle(101) 
関連する問題