2017-12-18 26 views
0

나는이 스칼라 문제에 대한 도움이 필요합니다.캐스팅하지 않고 스칼라 테스트에서 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에 접근하기 위해 나타나는 때마다 던져 넣어야한다. 나는이 코드를 그대로두고 테스트에서 캐스팅하지 않고 전용 멤버에 액세스하고 싶습니다. 매개 변수로받은 차량이 내가 반환 한 차량과 동일한 유형이라는 것을 알고 있습니다. 제네릭으로 해결할 수 있습니까?, 어떻게?

감사합니다. 나는 이해할 수 있기를 바랍니다.

+0

당신은 정말 그냥 서브 클래스 별, 클래스의'private' 회원을 의미하지 않는다? – Kraylog

+0

정확히 Nimrod Argov –

답변

1

나는 함수의 반환 유형에 제한을두기를 원한다고 생각한다. 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)