簡體   English   中英

依賴的類和類型

[英]Dependent classes and types

假設我想創建一個簡單的圖形表示形式,其中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[...])
}

一個簡單的例子將不勝感激。

重新使用類型參數有什么問題?

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM