2012-02-16 62 views
6

我有以下代碼:斯卡拉 - 與它的進口量(繼承進口)混合的特質

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

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

object C { 
    var value = 5 
} 

B類的價值是不可見的東西意味着A類固有的進口沒有被繼承B,儘管valueA內完全可見。如何實現也繼承導入的效果,這樣我可以避免顯式地將特性A混入的多個類中導入相同的東西?

+1

可能的重複[在Scala中,我如何將import語句傳遞給子類?](http://stackoverflow.com/questions/7252126/in-scala-how-do-i-pass-import-statements-通過子類) – Suma 2017-05-12 19:47:53

回答

11

導入不是一流的實體不會顯示您所期望的行爲。您可以代替調整你的設計正是如此接近實現的東西:

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'(其中'C'是我將通過'com.xyz.C'導入的方法的名稱)。 – socom1880 2016-03-05 02:03:04

+0

此外,如果我想包含所有內容,比如'com.xyz._'? – socom1880 2016-03-05 02:06:58

+0

對於上述兩種情況,您需要將實現移至特徵,然後獲得一個簡單擴展特徵的對象,就像在答案中一樣。性狀可以擴展到做「混合」,物體不能。要包含所有東西,比如com.xyz._,你需要通過一個包對象來實現com.xyz - 通過擴展一個包含所有實際實現的特徵來類似地實現包對象。然後,你可以利用這個特點在其他地方「混合」。 – RD1 2016-03-31 23:35:23