scala - 允许组合时在Scala中声明 protected 方法的惯用方式?

标签 scala inheritance composition protected idioms

我在包中有一个抽象类 foo (在这种特殊情况下,一个特征)可以由各种子类实现,我想创建一个正交子类以用于更具体的包bar添加特定于包的信息。似乎最好的方法是通过组合(包装)而不是继承,因为否则我必须声明 foo 中每一个的特定于包的版本-包子类。但这会导致需要转发的 protected 成员出现问题:

package foo {
  trait Foo {
    protected def bar: Int
  }
}

package bar {
  import foo.Foo
  class Baz
  class WrapFoo(wrapped: Foo) extends Baz with Foo {
    protected def bar = wrapped.bar
  }
}

这会导致错误:
~/test/scala 14:54 152272% scalac testprotected.scala
testprotected.scala:11: error: method bar in trait Foo cannot be accessed in foo.Foo
 Access to protected method bar not permitted because
 prefix type foo.Foo does not conform to
 class WrapFoo in package bar where the access take place
    protected def bar = wrapped.bar
                                ^
one error found

即使 WrapFooFoo 的子类, scala 不喜欢调用 wrapped.bar .我猜这是因为 WrapFoo 类型的对象不是 wrapped 的子对象.

问题是:在 bar 上声明保护的惯用方式是什么?除了简单地公开吗?函数barFoo 中的其他函数调用,不公开。 Scala 有一个富有表现力的保护系统,但我不太了解它。这可能吗?

最佳答案

将这两种类型放在一个公共(public)包中,它可以位于包层次结构中的任何位置,并且不必是直接父级。

然后你可以使用 protected[packagename]private[packagename]选择性地控制访问。

关于scala - 允许组合时在Scala中声明 protected 方法的惯用方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20939182/

相关文章:

javascript - 如何访问实例化为参数的对象?

java - 基类的运行时确定

json - 避免使用 Circe json 序列化器序列化为 null

java - 以下错误中发现的和必需的之间有什么区别

Java InstanceOf 输出

ruby - 我如何调用祖 parent 的方法,并在 ruby​​ 中跳过 parent

python - 管理(和重命名)类组合的实例变量

scala - Akka 集群应用程序上的协调关闭超时

scala - AnyVal 的目的是什么?

c++ - 通过模板特化继承