在普通项目中我有这个:
trait DBProvider
trait DBTableNamesProvider
trait DefaultDBProvider extends DBProvider
trait DefaultTableNames extends DBTableNamesProvider
trait MyService extends DBProvider with DBTableNamesProvider
object MyService {
def apply() = new MyService with DefaultDBProvider with DefaultTableNames {}
}
在我projectA
作为jar的common-project
引用我希望构建MyService
projectA(依赖于common-project):
object MyOtherApp {
trait MyOtherTableName extends DBTableNamesProvider
val MyCustomService = MyService() with MyOtherTableName // will not compile how to reuse the module's MyService() with another implementation of one of the traits?
}
以上不会编译我不能只调用MyService()构造并覆盖一些依赖项。
以上是我想要做的,我希望从一个不同的项目覆盖MyService()的工厂构造适用于我自己的MyProjectATableNames实现是否可能在scala?如果不是没有代码重复的推荐方法是什么?
答案 0 :(得分:1)
val MyCustomService = new MyService() with MyOtherTableName
应该有效
如果您还要继承DefaultDBProvider
和DefaultTableNames
,则必须明确地列出它们:
val MyCustomService = new MyService() with MyOtherTableName with DefaultDBProvider with DefaultTableNames
或在公共库中创建一个中间特征:
trait DefaultService extends MyService with DefaultDBProvider with DefaultTableNames
答案 1 :(得分:0)
你不能覆盖那样的构造类型,因为MyService()
不再是一个类型的对象了。因此,要重用代码,您可以创建类似
class ConfiguredMyService extends DefaultDBProvider with DefaultTableNames
在第一个应用程序中,您可以声明
object MyService {
def apply() = new ConfiguredMyService
}
并在第二个
val MyCustomService = new ConfiguredMyService with MyOtherTableName
注意:现在,Cake模式被认为是反模式,因此我建议您检查依赖注入。