Я делаю базовое представление графа в Scala.
abstract class Vertex
class Edge (
val source: Vertex
val dest: Vertex
)
class Graph[V <: Vertex] {
...
}
В какой-то момент мне нужно иметь возможность отсортировать список вершин в Graph[Vertex]
.Я хотел бы сделать это, позвонив по номеру vertices.sorted
.Если я заставлю Vertex продлить Ordered[Vertex]
, тогда у меня на самом деле не будет права compareTo
, поскольку информация об упорядочении будет являться данными в реализованном подклассе Vertex
, а compareTo
принимает любой Vertex
.Но если я сделаю мою Vertex
реализацию MyVertex
extension 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]
, но это не масштабируется.Можно ли иметь несколько ограничений типа?