2012-02-16 12 views
6

I、次のコードを有する:スカラ - 輸入(継承輸入)で形質に混合

trait A { 
    import org.somepackage.C._ 
} 

class B extends A { 
    def getValue = value 
       ^^^^^ 
} 

object C { 
    var value = 5 
} 

クラスBの値が表示されていないクラスAの固有のインポートがによって継承されなかったことを意味しはAの内部に完全に表示されますが、Bです。どのようにインポートを継承するという効果を達成するために、私は、形質がAで混在する複数のクラスで同じものを明示的にインポートすることを避けることができますか?

+1

[Scalaでは、インポートステートメントをサブクラスに渡すにはどうすればいいですか?](http://stackoverflow.com/questions/7252126/in-scala-how-do-i-pass-import-statements- – Suma

答えて

11

インポートは、ファーストクラスのエンティティではないため、期待している動作が示されません。代わりに近いものを達成するためにthuslyデザインを再構築することができます

trait A with C { 

} 

class B extends A { 
    def getValue = value // Now this will work. 
} 

trait C { 
    var value = 5 
} 

object C extends C 

このイディオムは、できるだけ少ない輸入品との租税ユーザーにScalaz 6で使用されています。

+0

これは、 'C'が形質である場合にのみ動作するように見えます。 'C'が何か他のものであれば(私の場合は' C'がメソッドです)?このパターンを使用しようとすると、単に 'Cは' com.xyz.C'経由でインポートされるメソッドの名前である 'Cを解決できません 'と表示されます。 – socom1880

+0

また、 'com.xyz._'のようにすべてを組み込みたいのであればどうしますか? – socom1880

+0

上記の両方の場合、インプリメンテーションを形質に移してから、答えのように単に形質を拡張するオブジェクトを持つ必要があります。特性は "ミキシング"を行うために拡張することができ、オブジェクトはできません。 com.xyz._のようにすべてを含めるには、パッケージオブジェクトを介してcom.xyzを実装する必要があります。パッケージオブジェクトはすべての実際の実装を持つ特性を拡張することによって同様に実装されます。次に、その特性を他の場所で「混在」することもできます。 – RD1