当允许组合时,在Scala中声明受保护方法的惯用方法?
我在package当允许组合时,在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
foo
中有一个抽象类(在这个特殊的例子中是一个trait),它可以由不同的子类实现,我想创建一个正交子类,用于更具体的packagebar
中,它添加了包特定的信息。似乎最好的方法是组合(包装)而不是继承,因为否则我必须声明每个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]
有选择地控制访问。这是唯一的方法吗?在我的例子中,这会使整个程序都可以访问代码。软件包的布局已经建立了很长时间,仅仅为了这个而重新调整会把很多其他事情搞砸。