依赖类和类型

时间:2012-09-11 05:34:56

标签: scala

假设我想创建一个简单的图形表示,其中VertexEdge及其类型相互依赖。具体实现可能如下所示:

case class Edge(id: Int, label: String, endpoints: (Vertex, Vertex))
case class Vertex(id: Int, data: Data, edges: Map[Int, Edge])

Edge取决于Vertex,反之亦然。我真正想要的是iddata等具有泛型类型。我想知道如何设计这个最佳方式?

trait Vertex[A, B] {
  def id: A
  def data: B
  // What about types for the edges etc?
}

trait Edge[A, ...] {
  def id: A
  def label: String
  def endpoints: (Vertex[...], Vertex[...])
}

非常感谢一个简单的例子。

2 个答案:

答案 0 :(得分:0)

重新使用类型参数有什么问题?

trait Vertex[A, B] {
  def id: A
  def data: B
  def edges: Map[A, Edge[A, B]]
}

然后在Edge

trait Edge[A, B] {
  def id: A
  def label: String
  def endpoints: (Vertex[A, B], Vertex[A, B])
}

答案 1 :(得分:0)

由于Vertex和Edge可以有不同的ID类型,您可能希望Vertex和Edge是Graph trait的内部特征,它具有所有类型参数。这样,Vertex可以了解Edge trait的ID类型,Edge可以了解Vertex特征的ID和数据类型。

trait Graph[VertexID, EdgeID, Data] {

  trait Vertex {
    def id: VertexID
    def data: Data
    def edges: Map[EdgeID, Edge]
  }

  trait Edge {
    def id: EdgeID
    def label: String
    def endpoints: (Vertex, Vertex)
  }

}

顺便提一下,由于路径相关类型,Edge只能有相同Graph中的端点,而Vertex只能有相同Graph中的边。