[英]Dependent classes and types
假设我想创建一个简单的图形表示形式,其中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[...])
}
一个简单的例子将不胜感激。
重新使用类型参数有什么问题?
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])
}
由于Vertex和Edge可以具有不同的ID类型,因此您可能希望将Vertex和Edge作为具有所有类型参数的Graph特征的内部特征。 这样,Vertex可以知道Edge特征的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将只能具有同一图形中的端点,而Vertex将只能具有同一图形中的边缘。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.