Вопрос о Двунаправленные ссылки в признаках с одним типом , направленный на то, чтобы иметь ссылку на это , когда и родители, и дети относятся к одному и тому же типу.
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
}
}