Scala:如何使子类(在其他实例上)可以访问受保护的方法?
Posted
技术标签:
【中文标题】Scala:如何使子类(在其他实例上)可以访问受保护的方法?【英文标题】:Scala: How to make a protected method accessible to sub-classes (on other instances)? 【发布时间】:2016-04-04 18:09:52 【问题描述】:我正在尝试做这样的事情:
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
s。
还有其他方法吗?
【问题讨论】:
【参考方案1】:怎么样:
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]
,即使这意味着在你的情况下选择一个通用的基础包。
【讨论】:
我基本同意,这通常是“组合优于继承”的问题。无论如何,在我目前的情况下(就像在许多其他情况下一样),我受到了很久以前在遥远星系中编写的代码的限制......以上是关于Scala:如何使子类(在其他实例上)可以访问受保护的方法?的主要内容,如果未能解决你的问题,请参考以下文章