2012-02-16 29 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