关于Bidirectional Links in Traits with a Single Type的问题,专注于在父母和孩子都是同一类型时引用 this 。
self 是一个很好的解决方案,适用于父类和子类是同一类型的情况......但是,如果父类和子代的类型与问题末尾的代码不同,那该怎么办?
注释行错误错误正确地抱怨:
类型不匹配;发现:PolyTree.this.type(底层类型为T)需要:C
这完全有道理,因为 self 被定义为T。
目标是能够写下:
val parentOrder = new ParentOrder
val childOrder = new ChildOrder
childOrder.addParent(parentOrder)
其中parentOrder被添加到childOrder的父项和中,childOrder被添加到parentOrder的子项中。
任何想法如何构造代码以删除错误并能够编写如上所示的代码?
trait PolyTree[T <: PolyTree[T, C], C <: PolyTree[T, C]] { self: T =>
private val _parents: ListBuffer[T] = ListBuffer()
private val _children: ListBuffer[C] = ListBuffer()
def addParent(parent: T): PolyTree[T, C] = {
_parents += parent
parent._children += this // Error
this
}
def addChild(child: C): PolyTree[T, C] = {
_children += child
child._parents += this
this
}
}
答案 0 :(得分:0)
基本上相同的解决方案,你需要T和C作为自我类型,所以:
trait PolyTree[T <: PolyTree[T, C], C <: PolyTree[T, C]] { self: T with C => ...