Scala:如何使子类可以访问受保护的方法(在其他实例上)?

时间:2015-12-30 18:30:35

标签: scala inheritance access-modifiers

我正在尝试做这样的事情:

trait A[Out] {
    protected def foo(): Out
}

trait B extends A[Int]

class WrapperB(b: B) extends B {
    override protected def foo(): Int = b.foo() + 1
}

这不会编译,因为WrapperB无法访问b.foo()

有几种方法可以解决这个问题,但这些方法对我不起作用:

  1. 公开foo:不起作用,因为我希望它保持protected
  2. 使用包范围:不起作用,因为我打算在不同的包中有很多B
  3. 还有其他办法吗?

1 个答案:

答案 0 :(得分:4)

怎么样:

next()

我从来不喜欢trait A[Out] { protected def foo(): Out } trait B extends A[Int] { protected def gimme(that: B) = that.foo() } class WrapperB(b: B) extends B { override protected def foo(): Int = gimme(b) + 1 } private可以访问其他值的方法的想法,我认为这是糟糕的设计。 protected应该是private。如果您需要跨值访问,我认为您应该声明private[this],即使这意味着在您的情况下选择一个公共基础包。