2011-10-23 8 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の修飾子を変更することができます。

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

(:このコンパイルしていませんが

trait TreeImpl[A] extends Tree[A] { 
    def test2(n: TNode): Option[TNode] = Option(n.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) 
} 
関連する問題