限定内在特征的方法,使其从外部私密,但可从内部访问

时间:2011-10-23 14:15:57

标签: scala private traits

我想限定一个内部特征的方法,以便它只能被外部特征的子类访问。 E.g:

trait Tree[A] {
  trait TNode {
    final def prevOption: Option[TNode] = Option(prev)
    protected[Tree] def prev: TNode // !
  }

  def test(n: TNode): Option[TNode] = Option(n.prev)
}

如何修改prev的限定符,以便以下执行编译:

trait TreeImpl[A] extends Tree[A] {
  def test2(n: TNode): Option[TNode] = Option(n.prev)
}

虽然编译:

def test3[A](t: Tree[A]#TNode) = t.prev

(也就是说,公共def prev: TNode不是一种选择。)

1 个答案:

答案 0 :(得分:1)

似乎这是不可能的。

一个可能的解决方法是Tree上的受保护的访问器方法,就像这样(我删除了一些东西,使代码更清晰):

trait Tree {
    trait TNode {
        private[Tree] def prev : TNode
    }
    protected final def prevAccessor(n: TNode) = n.prev
    def test( n: TNode ) = n.prev
}

trait TreeImpl extends Tree {
    def test2( n: TNode ) = prevAccessor(n)
}