「明示的に型付けされた自己参照」の議論を見ています。例は次のように始まります。
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
a を期待しているのに、内部の呼び出しで a を取得することです。Node
NodeImpl
connectWith
なぜこれは自業自得の問題ではないのでしょうか? のサブタイプではなく、抽象クラスまたは特性を最初に宣言Node
することで簡単に解決できないでしょうか? それが行われていれば、のサブクラスになる可能性があり、すべて問題ありません。NodeIntf
NodeImpl
Node