Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当允许组合时,在Scala中声明受保护方法的惯用方法?_Scala_Inheritance_Composition_Protected_Idioms - Fatal编程技术网

当允许组合时,在Scala中声明受保护方法的惯用方法?

当允许组合时,在Scala中声明受保护方法的惯用方法?,scala,inheritance,composition,protected,idioms,Scala,Inheritance,Composition,Protected,Idioms,我在packagefoo中有一个抽象类(在这个特殊的例子中是一个trait),它可以由不同的子类实现,我想创建一个正交子类,用于更具体的packagebar中,它添加了包特定的信息。似乎最好的方法是组合(包装)而不是继承,因为否则我必须声明每个foo-包子类的包特定版本。但这会导致需要转发的受保护成员出现问题: package foo { trait Foo { protected def bar: Int } } package bar { import foo.Foo

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

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
尽管
WrapFoo
Foo
的子类,scala不喜欢调用
wrapped.bar
。我猜这是因为
WrapFoo
类型的对象不是
wrapped
的子对象


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

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


然后您可以使用
受保护的[packagename]
专用[packagename]
有选择地控制访问。

这是唯一的方法吗?在我的例子中,这会使整个程序都可以访问代码。软件包的布局已经建立了很长时间,仅仅为了这个而重新调整会把很多其他事情搞砸。