假设我想创建一个简单的图形表示,其中Vertex
和Edge
及其类型相互依赖。具体实现可能如下所示:
case class Edge(id: Int, label: String, endpoints: (Vertex, Vertex))
case class Vertex(id: Int, data: Data, edges: Map[Int, Edge])
Edge
取决于Vertex
,反之亦然。我真正想要的是id
,data
等具有泛型类型。我想知道如何设计这个最佳方式?
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[...])
}
非常感谢一个简单的例子。
答案 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中的边。