Определение метода внутреннего признака так, чтобы он был закрытым снаружи, но доступным изнутри

#scala #private #traits

#scala #Частное #Трейты

Вопрос:

Я хотел бы квалифицировать метод внутреннего признака так, чтобы к нему могли получить доступ только подклассы внешнего признака. Например.:

 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)
}