Scala有序Mixin基类

Scala有序Mixin基类,scala,base-class,traits,Scala,Base Class,Traits,在Scala 2.10.2中,我有一个主次样式版本号的抽象基类: abstract class MajorMinorVersion( private [version] val major : Int, private [version] val minor : Int ) extends Ordered[MajorMinorVersion] { override def toString() : String = "%d.%d".format( major, min

在Scala 2.10.2中,我有一个主次样式版本号的抽象基类:

abstract class MajorMinorVersion( 
    private [version] val major : Int,
    private [version] val minor : Int
) extends Ordered[MajorMinorVersion] 
{
    override def toString() : String = "%d.%d".format( major, minor )

    def compare( that : MajorMinorVersion ) = that.major == major match
    {
        case false => major - that.major
        case true => minor - that.minor
    }
}
我正在阅读的几种自定义文件类型具有以下格式的版本号:

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
最好的办法是什么?是否可以将
有序的
特征混合到基类中,或者我需要将其混合到继承类中,并在那里定义
比较
方法?我想这将是一个解决方案,但如果能够将比较抽象成一个基类就好了


我确信在某个地方有一个相对简单的解决方案,我只是错过了。提前谢谢

参数化要订购的类型:

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 )

抽象类主版本[V这似乎是一个合理的想法。有没有办法避免显式地进行类型参数化?在两个case类声明中意外地省略显式类型不会导致case编译失败,然后这两种类型又可以进行比较……您可以在
majorminorvision
的左括号后添加
this:V=>
>类定义。这将强制您在子类中指定正确的类型参数。
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 )