Scala Ordered Mixin基类

时间:2014-07-22 09:30:28

标签: 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, 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

这种方法的问题在于,我希望比较FooFileVersionBarFileVersion个实例来抛出错误,因为比较它们没有意义,但目前我们有:

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

解决这个问题的最佳方法是什么?是否可以将Ordered特征混合到基类中,还是需要将其混合到继承类中,并在那里定义compare方法?我想这可能是一个解决方案,但能够将比较抽象为基类会很好。

我确信在某个地方我只是缺少一个相对简单的解决方案。提前谢谢!

1 个答案:

答案 0 :(得分: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 )

这样,不同的实现类将是不兼容的。排序