2014-07-22 3 views
0

을 주문, 나는 메이저 마이너 스타일의 버전 번호에 대한 추상 기본 클래스를 형식 :스칼라 스칼라 2.10.2에서 믹스 인 자료를 클래스

case class FooFileVersion(maj : Int, min : Int) extends MajorMinorVersion(maj, min) 

case class BarFileVersion(maj : Int, min : Int) extends MajorMinorVersion(maj, min) 

이 점에서 잘 작동 :

scala> FooFileVersion(1, 3) < FooFileVersion(1, 4) 
res0: Boolean = true 

이 방법의 문제는 내가 원하는 것입니다 닷컴 그들을 비교하는 것은 이해가되지 않기 때문에 FooFileVersionBarFileVersion 인스턴스 패 리슨은 오류가 발생,하지만 현재 우리는이 :

scala> FooFileVersion(1, 3) < BarFileVersion(1, 4) 
res0: Boolean = true 

이 주위에 얻을 수있는 가장 좋은 방법은 무엇입니까? Ordered 특성을 기본 클래스에 혼합 할 수 있습니까? 아니면 상속 클래스에 혼합해야하고 compare 메서드를 정의해야합니까? 그것은 해결책이 될 것입니다.하지만 비교를 기본 클래스로 추상화 할 수 있다면 좋을 것입니다.

내가 누락 된 비교적 간단한 해결책이 있다고 확신합니다. 미리 감사드립니다!

답변

2

변수화를 유형은 주문하기 :

abstract class MajorMinorVersion[V <: MajorMinorVersion[V]](...) extends Ordered[V] { 
    ... 
    def compare(that: V) 
    ... 
} 

case class FooFileVersion(maj : Int, min : Int) extends MajorMinorVersion[FooFileVersion](maj, min) 
case class BarFileVersion(maj : Int, min : Int) extends MajorMinorVersion[BarFileVersion](maj, min) 

이 방법은 서로 다른 구현 클래스는 호환되지 않는 WRT 될 것입니다. 주문.

+0

그것은 합리적인 생각처럼 보입니다. parameterize를 명시 적으로 입력하지 않아도되는 방법이 있습니까? 실수로 두 개의 case 클래스 선언에서 명시적인 타입을 벗어나지 않으면 컴파일 실패가 발생하지 않으며 두 타입은 다시 비교할 수 있습니다 ... – paulmdavies

+1

'MajorMinorVersion' 클래스의 여는 중괄호 뒤에'this : V =>'를 추가 할 수 있습니다 정의. 이렇게하면 서브 클래스에 올 Y 른 유형 매개 변수를 지정하도록 강요합니다. 예 : http://stackoverflow.com/a/9077750/3080813 – blintend