Определение метода внутренней черты, чтобы он был приватным снаружи, но доступным изнутри. - PullRequest
2 голосов
/ 23 октября 2011

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

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

В то время как этот делаетне compile:

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

(то есть публичный def prev: TNode не вариант).

1 Ответ

1 голос
/ 13 ноября 2011

Кажется, что это невозможно.

Возможный обходной путь - это защищенный метод доступа в 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)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...