在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
这种方法的问题在于,我希望比较FooFileVersion
和BarFileVersion
个实例来抛出错误,因为比较它们没有意义,但目前我们有:
scala> FooFileVersion( 1, 3 ) < BarFileVersion( 1, 4 )
res0: Boolean = true
解决这个问题的最佳方法是什么?是否可以将Ordered
特征混合到基类中,还是需要将其混合到继承类中,并在那里定义compare
方法?我想这可能是一个解决方案,但能够将比较抽象为基类会很好。
我确信在某个地方我只是缺少一个相对简单的解决方案。提前谢谢!
答案 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 )
这样,不同的实现类将是不兼容的。排序