在抽象类中要求订购子类型

时间:2011-11-14 23:19:30

标签: scala

我在Scala中制作基本的图表。

abstract class Vertex
class Edge (
  val source: Vertex
  val dest: Vertex
)
class Graph[V <: Vertex] {
  ...
}

在某些时候,我需要能够在Graph[Vertex]中对顶点列表进行排序。我想通过致电vertices.sorted来做到这一点。如果我使Vertex扩展Ordered[Vertex],那么我实际上没有正确的compareTo,因为排序信息将是VertexcompareTo实现的子类中的数据任何Vertex。但是,如果我将Vertex实施MyVertex扩展为Ordered[MyVertex],则Graph[MyVertex]中无法提供该信息。

这个问题的最佳解决方案是什么?我应该使用隐式排序吗?有没有办法强制Vertex的子类对自己有隐式排序?

我宁愿不做以下事情:

class MyClass extends Vertex {
  override def compare(that: Vertex) = that match {
    case that: MyClass => // do the comparison
    case _ => false
  }
}

更新:也许Graph的构造函数需要Ordering[V]

更新:我总是可以限制V <: Ordered[V],但这不会扩展。是否可能有多种类型限制?

3 个答案:

答案 0 :(得分:1)

  

更新:也许Graph的构造函数需要Ordering[V]

这将是我首选的方法,因为这样您可以根据需要传递不同的Ordering

  

更新:我总是可以限制V <: Ordered[V],但这不会扩展。是否可能有多种类型限制?

是的,因为Scala有交集类型:V <: Ordered[V] with Something[V] with SomethingElse[V]

答案 1 :(得分:1)

为什么不呢?

class Graph[V <: Vertex with Ordered[V]]

或者你也可以采用Ordering的方式:

class Graph[V <: Vertex : Ordering]

答案 2 :(得分:0)

为什么不将Graph类设计为包含ListVertex个对象?然后,您可以使用List的方便的内置sortWith方法。

例如:

class Graph(val Vertices:List[Vertex]) {
  def sorted():Graph = {
    new Graph(Vertices.sortWith((v1, v2) => { /* your comparison logic here */ }))
  }
}

希望指出你正确的方向。