Scala self type e this.type na edição de coleções

Estou tentando entender minha opinião de tipos abstratos e explícitos no scala. Vamos considerar este exemplo: quero criar uma base para árvore extensível tão simples quanto esta:

trait Tree {
  def children: Iterable[Tree]
  def descendants: Iterable[Tree] = { val dv = children.view; dv ++ (dv.flatMap { _.children }) }
}

o entanto, quero poder estender nós de árvore com alguns métodos e usar esses métodos como:tree.children foreach { _.newMethod() }

Para isso, tentei:

UMA. this.type: FAIL

trait Tree {
    def children: Iterable[this.type] 
    def descendants: Iterable[this.type] = {
      val dv = children.view
      // FAIL: type mismatch;  found   :  scala.collection.IterableView[com.abovobo.data.Tree,Iterable[_]]  required: Iterable[Tree.this.type] 
      // dv ++ (dv.flatMap { _.children })
      // OK: 
      dv.++[this.type, Iterable[this.type]](dv.flatMap[this.type, Iterable[this.type]]{ _.children })
    }
}

A variante de trabalho é bastante desajeitad

B. Tipos abstratos: FAIL

trait Tree {
    type Node <: Tree

    def children: Iterable[Node]  
    def descendants: Iterable[Node] = {
        val dv = children.view
        // FAIL: type mismatch;  found   : scala.collection.IterableView[com.abovobo.data.Tree#Node,Iterable[_]]  required: Iterable[Tree.this.Node] 
        dv ++ (dv.flatMap { _.children })
    }
}

Não funciona de maneira alguma devido à incompatibilidade de tipo específico de caminho, como eu entend

C. Digite parâmetros (genéricos): OK

trait Tree[+Node <: Tree[Node]] {

    def children: Iterable[Node]

    def descendants: Iterable[Node] = {
       val dv = children.view
       dv ++ (dv.flatMap { _.children })
    }
}

Funciona OK, mas não é tão bom de manter em classes derivada

Alguma idéia de como fazer com que as duas primeiras variantes funcionem sem muito códig

Além disso, com este this.type eu tive problemas com a implementaçã

trait BiDTree extends Tree {
    def parent: Option[this.type]
}

// how to accept this param? Option[TreeImpl] doesn't work. 
class TreeImpl(val parent: Option[???]) extends BiDTree {
  // ...
}

Obrigado

questionAnswers(4)

yourAnswerToTheQuestion