我想限定一个内部特征的方法,以便它只能被外部特征的子类访问。 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
不是一种选择。)
答案 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)
}