bug592.scala
来自「JAVA 语言的函数式编程扩展」· SCALA 代码 · 共 72 行
SCALA
72 行
trait Graph { type Edge; type Node <: NodeIntf; trait NodeIntf { def connectWith(node: Node): Edge; } def nodes: List[Node]; def edges: List[Edge]; def addNode: Node; protected var ids = 0;}abstract class DirectedGraph extends Graph { type Edge <: EdgeImpl; class EdgeImpl(origin: Node, dest: Node) { def from = origin; def to = dest; override def toString = ""+origin+" --> "+dest } class NodeImpl extends NodeIntf { self: Node => val id = ids ids = ids + 1 def connectWith(node: Node): Edge = { val edge = newEdge(this, node); edges = edge :: edges; edge; } override def toString = "Node "+id } protected def newNode: Node; protected def newEdge(from: Node, to: Node): Edge; var nodes: List[Node] = Nil; var edges: List[Edge] = Nil; def addNode: Node = { val node = newNode; nodes = node :: nodes; node; }}class ConcreteDirectedGraph extends DirectedGraph { type Edge = EdgeImpl; type Node = NodeImpl; protected def newNode: Node = { new NodeImpl; } protected def newEdge(f: Node, t: Node): Edge = { new EdgeImpl(f, t); }}object ExplicitThis { def main(args: Array[String]): Unit = { val g: Graph = new ConcreteDirectedGraph; val n1 = g.addNode; val n2 = g.addNode; val n3 = g.addNode; Console.println(n1.connectWith(n2)) Console.println(n2.connectWith(n3)) Console.println(n1.connectWith(n3)) }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?