我在包中有一个抽象类foo
(在这个特殊情况下,一个特性),可以由各种子类实现,我想创建一个正交子类,用于一个更具体的包bar
,添加特定于包的信息.似乎最好的方法是通过组合(包装)而不是继承,因为否则我必须声明每个foo
-package子类的特定于包的版本.但这会导致需要转发的受保护成员出现问题:
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
除了简单地公开保护之外,宣布保护的惯用方法是什么?该函数bar
旨在由其他函数调用Foo
,而不是公开调用.Scala有一个富有表现力的保护系统,但我不太明白.这有可能吗?