2011-10-23 55 views
2

我想限定一個內部特徵的方法,以便它只能由外部特徵的子類訪問。例如:限定內在特質的方法,使其從外部是私人的,但可從內部訪問

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

看起來好像這是不可能的。

可能的解決方法是在樹保護存取方法,像這樣(我刪除了一些東西,使代碼更清晰):

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) 
} 
相關問題