私はさまざまなサブクラスで実装できるfoo
の抽象クラスを持っています(この特定のケースでは、特性)、より具体的なパッケージbar
で使用する直交サブクラスを作成したいと思います。情報それ以外の場合は、foo
-packageサブクラスのすべてのパッケージ固有のバージョンを宣言しなければならないため、継承よりも合成(ラッピング)が最善の方法です。しかし、これは転送する必要が保護されたメンバーとの問題につながる:合成を許可するときにScalaで保護されたメソッドを宣言する慣用句?
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は表現力豊かな保護システムを持っていますが、私はそれをあまり理解していません。これはまったく可能ですか?
これが唯一の方法ですか?私の場合、これはコードをプログラム全体にアクセス可能にする効果があります。パッケージのレイアウトはすでに長い間確立されており、このためだけにrejiggeringは他の多くのものを混乱させるでしょう。 –