具有不同类型的特征中的双向链接

时间:2011-05-15 17:51:58

标签: scala

关于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

    }




}

1 个答案:

答案 0 :(得分:0)

基本上相同的解决方案,你需要T和C作为自我类型,所以:

trait PolyTree[T <: PolyTree[T, C], C <: PolyTree[T, C]]  { self: T with C => ...