我正在尝试做这样的事情:
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()
。
有几种方法可以解决这个问题,但这些方法对我不起作用:
- 公开
foo
:不会起作用,因为我希望它保持protected
。 - 使用包范围:不会起作用,因为我打算在不同的包中有许多
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
}
我一直不喜欢 private
和 protected
可以访问其他值的方法的想法,我认为这是糟糕的设计。 private
应该表示 private[this]
。如果您需要跨值访问,我认为您应该声明 private[my-package]
,即使这意味着在您的情况下选择一个公共(public)基础包。
关于Scala:如何使子类(在其他实例上)可以访问 protected 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34535095/