Требовать в абстрактном классе, чтобы подтипы были упорядочены - PullRequest
0 голосов
/ 15 ноября 2011

Я делаю базовое представление графа в 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], но это не масштабируется.Можно ли иметь несколько ограничений типа?

Ответы [ 3 ]

1 голос
/ 15 ноября 2011

Почему не только это?

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

Или вы можете пойти по пути Ordering:

class Graph[V <: Vertex : Ordering]
1 голос
/ 15 ноября 2011

Обновление: возможно, конструктору Graph нужно взять Ordering[V]?

Это мой предпочтительный подход, потому что таким образом вы можете передать другой Orderingпри необходимости.

Обновление: я всегда могу ограничить V <: Ordered[V], но это не масштабируется.Возможно ли иметь множественные ограничения типов?

Да, поскольку в Scala есть типы пересечений: V <: Ordered[V] with Something[V] with SomethingElse[V].

0 голосов
/ 15 ноября 2011

Почему бы не создать класс Graph, содержащий List из Vertex объектов? Затем вы можете использовать удобный встроенный метод List sortWith.

Например:

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

Надеюсь, это направит вас в правильном направлении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...