scala中实现图形的子类列表

scala中实现图形的子类列表,scala,oop,graph,Scala,Oop,Graph,我正在研究如何在scala中实现一个图,我真正想要的是一个边列表(假设已经定义),就像一个列表[Edge],但是有一些额外的方法,例如返回所有顶点。但是列表是密封的(最终的?),不能再分类 我该怎么做呢 object Main { implicit def listToGraph(list: List[Edge]): Graph = new Graph(list) class Graph(e: List[Edge]) { def vertices() = (e.map(_.v

我正在研究如何在scala中实现一个图,我真正想要的是一个边列表(假设已经定义),就像一个列表[Edge],但是有一些额外的方法,例如返回所有顶点。但是列表是密封的(最终的?),不能再分类

我该怎么做呢

object Main {

  implicit def listToGraph(list: List[Edge]): Graph = new Graph(list)

  class Graph(e: List[Edge]) {
    def vertices() = (e.map(_.v1) ++ e.map(_.v2)).distinct
  }

  case class Edge(v1: Long, v2: Long)

  def main(args: Array[String]): Unit = {
    val e: List[Edge] = List(Edge(0, 1), Edge(0, 2))
    e.vertices.foreach(println)
  }
}

这段代码是有效的——从某种意义上说,我可以调用
列表[Edge]
上的
顶点,但我真正想做的是创建一个名为Graph的类,在这个类上我可以调用
列表[Edge]中的任何方法
顶点

通过将图形隐式转换为列表,您可以更好地为解决方案建模:

case class Edge(v1: Long, v2: Long) 

case class Graph(e: List[Edge]) {
      def vertices() = (e.map(_.v1) ++ e.map(_.v2)).distinct
    } 

implicit def graphToList(graph: Graph): List[Edge] = graph.e 

val g = Graph(List(Edge(0, 1), Edge(0, 2))) 

g.head  // use graph as a list

当你尝试时会发生什么?你确实意识到,你可以用写问题所需时间的一半来尝试这个方法,而且你可以在几毫秒内得到答案,而不必等待几个小时,甚至根本没有什么用处。