我正在查看“显式类型的自我引用”讨论。这个例子是这样开始的。
abstract class Graph {
type Edge
type Node <: NodeIntf
abstract class NodeIntf {
def connectWith(node: Node): Edge
}
def nodes: List[Node]
def edges: List[Edge]
def addNode: Node
}
该示例在self尝试声明Graph.
abstract class DirectedGraph extends Graph {
...
class NodeImpl extends NodeIntf {
def connectWith(node: Node): Edge = {
val edge = newEdge(this, node)
edges = edge :: edges
edge
}
}
protected def newEdge(from: Node, to: Node): Edge
...
}
问题是该函数newEdge期望 aNode作为它的第一个参数,但NodeImpl在内部调用它时得到 a connectWith。
为什么这不是一个自己造成的问题?通过声明Node一个抽象类或一个特征开始而不是一个子类型来解决NodeIntf?如果这样做NodeImpl可以是一个子类,Node一切都会好起来的。