在Scala中的测试中访问私有变量而不进行强制转换

问题描述 投票:0回答:1

我需要你帮助我解决这个Scala问题。

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

我的问题是当我必须测试它时,因为我正在返回一辆车(比如说是一个混合车),我必须每次出现以便进入所涉及的车辆的私人变速器。我想要一种方法来保留这些代码,并且在测试中访问私有成员而不进行投射,因为我知道我作为参数接收的车辆与我返回的车辆的类型相同。这可以通过泛型来解决吗?,怎么样?

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

scala casting pattern-matching
1个回答
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)
© www.soinside.com 2019 - 2024. All rights reserved.