私は別のパッケージで定義された特性を混在させる必要があります。テストを支援するために、この特性の保護されたメソッドはパッケージ修飾されています。異なるパッケージのクラスによるパッケージ保護されたメソッドの継承
package A {
trait X {
protected[A] def method(arg: Int)
}
}
package B {
class Y extends A.X {
protected[A] def method(arg: Int) { }
}
}
2.9.1利回りscalacでこれをコンパイルする:この内の他のアクセス修飾子の結果に "保護された[A]" クラスのYを変更
test.scala:9: error: A is not an enclosing class
protected[A] def method(arg: Int) { }
:
ここでは一例であり、test.scala:9: error: overriding method method in trait X of type (arg: Int)Unit;
method method has weaker access privileges; it should be at least protected[A]
override protected def method(arg: Int) { }
私の質問はこれです:形質Xの定義を変更できないと仮定すると、それは特性Xを拡張することができるクラスYに何らかの変更がありますか? (ある程度の「保護された」アクセスを維持しながら)
これができない場合は、これを回避するための推奨される他の設計方法がありますか? (「方法」公開以外)
私は、これが設計上不可能かどうかの簡単な質問に答えようとしています。つまり、修正する唯一の(簡単な)方法は 'protected [A]'を 'public'に変更することです。パッケージに関係なく、サブクラスのように見えますが、アクセスできるはずですか?か否か? – nu11ptr
クラスYの定義をクラスと特性に分解することは、ここの「正しい」解決策のようです。私はその特性をAのサブパッケージに入れ、そこでメソッドを定義し、それをクラスYと混合します。現実世界では、Aは「市場データ」であり、Bは「ブローカー」であるので意味があります最終的に、この機能を分割するデータプロバイダであるブローカインスタンスがある場合は、マーケットデータのサブパックに入れて混在させてください。これはおそらく2つの全く異なる懸念事項であるため、注文処理と市場データ)。 – nu11ptr