2011-12-31 13 views
5

私は別のパッケージで定義された特性を混在させる必要があります。テストを支援するために、この特性の保護されたメソッドはパッケージ修飾されています。異なるパッケージのクラスによるパッケージ保護されたメソッドの継承

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に何らかの変更がありますか? (ある程度の「保護された」アクセスを維持しながら)

これができない場合は、これを回避するための推奨される他の設計方法がありますか? (「方法」公開以外)

+0

私は、これが設計上不可能かどうかの簡単な質問に答えようとしています。つまり、修正する唯一の(簡単な)方法は 'protected [A]'を 'public'に変更することです。パッケージに関係なく、サブクラスのように見えますが、アクセスできるはずですか?か否か? – nu11ptr

+0

クラスYの定義をクラスと特性に分解することは、ここの「正しい」解決策のようです。私はその特性をAのサブパッケージに入れ、そこでメソッドを定義し、それをクラスYと混合します。現実世界では、Aは「市場データ」であり、Bは「ブローカー」であるので意味があります最終的に、この機能を分割するデータプロバイダであるブローカインスタンスがある場合は、マーケットデータのサブパックに入れて混在させてください。これはおそらく2つの全く異なる懸念事項であるため、注文処理と市場データ)。 – nu11ptr

答えて

2

私はこれをアダプターで解決しました。オリジナルの特性を変更することはできませんが、別のパッケージを同じパッケージに追加することはできます(ただし、他の理由でクラスYをそのパッケージに入れることは意味がありません)。クラスYの 'adapterMethod'はBとして実験的にパッケージ化されていますが、これは私の使用例では不要です。 Scalaの2.9.1で、次のコンパイル:

package A { 
    trait X { 
    protected[A] def method(arg: Int) 
    } 

    trait PackageAdapter { 
    protected[A] def method(arg: Int) { adapterMethod(arg) } 

    protected def adapterMethod(arg: Int) 
    } 
} 

package B { 
    class Y extends A.X with A.PackageAdapter { 
    protected[B] def adapterMethod(arg: Int) { } 
    } 
} 

は、私は、このソリューションに夢中ないんだけど、それはそれほど悪くないです。クラスXは、パッケージXに含まれるクラスの残りの部分がパッケージAに含まれているため、クラスYは例外的なケースです(他の多くの理由から、クラスYはパッケージBになければなりません)。どんな良いアイデアですか?

+0

AからBを派生できますか?「パッケージA.B {クラスY ...」ですか? – TechNeilogy

+0

AとBはお互いに関係がなく、それぞれに多くのクラスがあるので、技術的には、はい、しかし、それは他の多くの理由から恣意的で「間違っている」でしょう。しかし、提案をありがとう。 – nu11ptr

+0

更新:私は2つのパーカケージの間でクラスYを分割することで、同様のことをします。 – nu11ptr

関連する問題