Двунаправленные ссылки в чертах разных типов - PullRequest
0 голосов
/ 15 мая 2011

Вопрос о Двунаправленные ссылки в признаках с одним типом , направленный на то, чтобы иметь ссылку на это , когда и родители, и дети относятся к одному и тому же типу.

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

    }




}

1 Ответ

0 голосов
/ 15 мая 2011

В основном это одно и то же решение, вам нужны и T, и C как self type, так:

trait PolyTree[T <: PolyTree[T, C], C <: PolyTree[T, C]]  { self: T with C => ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...