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