2017-12-18 252 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)