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()
。
有几种方法可以解决这个问题,但这些方法对我不起作用:
- 使
foo
public: 不会工作,因为我希望它保留 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]
。如果你需要 cross-value 访问权限,我认为你应该声明 private[my-package]
,即使这意味着在你的情况下选择一个通用的基础包。
我正在尝试做这样的事情:
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
public: 不会工作,因为我希望它保留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]
。如果你需要 cross-value 访问权限,我认为你应该声明 private[my-package]
,即使这意味着在你的情况下选择一个通用的基础包。