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

Scala: How to make a protected method accessible to sub-classes (on other instances)?

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

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 public: 不会工作,因为我希望它保留 protected
  2. 使用包范围:不会起作用,因为我打算在不同的包中有很多 B

还有其他方法吗?

怎么样:

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
}

我一直不喜欢 privateprotected 可以访问其他值的方法的想法,我认为这是糟糕的设计。 private 应该表示 private[this]。如果你需要 cross-value 访问权限,我认为你应该声明 private[my-package],即使这意味着在你的情况下选择一个通用的基础包。