在单独的子模块中实现伴随对象/工厂

时间:2017-09-29 13:26:12

标签: scala sbt companion-object

在我的core sbt模块中,我有一个矩阵数据类型的特征Matrix和一个具有一些工厂方法的特征MatrixInstance。伴侣对象应该扩展这个特性。

在一个单独的sbt子模块implementation1中,我想实现这个

object Matrix extends MatrixInstance { ... }

伴侣。

这里的想法是,如果我决定进行第二次实施,那么图书馆用户可以将他的libraryDependencies += ...implementation1更改为implementation2

但是,这似乎不起作用。即它看起来像一个对象,它的伴侣必须驻留在同一个模块(文件?)。否则我得到循环依赖,scalac失败。

我可以使用任何模式来实现此功能吗?即定义工厂/伴随对象的接口特征,将其实现在单独的工件中,然后允许用户仅通过更改libraryDependencies来选择实现?

1 个答案:

答案 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