我正在查看“显式类型的自我引用”讨论。这个例子是这样开始的。
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
一切都会好起来的。