在我的core
sbt模块中,我有一个矩阵数据类型的特征Matrix
和一个具有一些工厂方法的特征MatrixInstance
。伴侣对象应该扩展这个特性。
在一个单独的sbt子模块implementation1
中,我想实现这个
object Matrix extends MatrixInstance { ... }
伴侣。
这里的想法是,如果我决定进行第二次实施,那么图书馆用户可以将他的libraryDependencies += ...
从implementation1
更改为implementation2
。
但是,这似乎不起作用。即它看起来像一个对象,它的伴侣必须驻留在同一个模块(文件?)。否则我得到循环依赖,scalac失败。
我可以使用任何模式来实现此功能吗?即定义工厂/伴随对象的接口特征,将其实现在单独的工件中,然后允许用户仅通过更改libraryDependencies
来选择实现?
答案 0 :(得分:0)
如果它们必须位于不同的文件中,请不要将其称为Matrix
。您可以为其命名,例如matrix
。它不会成为伴随对象,因此它不会自动包含在与Matrix
相关的隐式搜索中,但您可以随时导入它。
例如,Scalaz和Cats都有一个list
对象,其中包含stdlib List
的许多类型类实例和语法,例如https://github.com/scalaz/scalaz/blob/v7.2.11/core/src/main/scala/scalaz/std/List.scala