2017-12-18 253 views
0

我需要你的帮助,我有这个斯卡拉问题。访问私有变量在斯卡拉测试没有铸造

我有一个类的层次结构:车辆只有每个车辆的共同变量,然后是3个子类:Car,Truck和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>>>) 
     } 
    } 
} 

我的问题是,当我必须测试它,因为我返回一个车辆(可以说一个混合),我必须在每次出现时都施放以便获得所涉及的车辆的私人汽车。 我想离开这段代码的样子,并且在测试过程中访问私有成员而不投射,知道我作为参数收到的车辆与我返回的车辆类型相同。 这可以通过泛型来解决吗?如何?

谢谢,我希望它是可以理解的。

+0

我猜你真的不意味着该类的'private'成员,继承特定的公正? – Kraylog

+0

恰恰是尼姆罗德阿尔戈夫 –

回答

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)