2017-09-29 8 views
0

私のcore sbtモジュールには、マトリックスデータ型の場合はMatrix、ファクトリメソッドがある場合はMatrixInstanceという特性があります。コンパニオンオブジェクトは、この特性を拡張することになっています。別のSBTサブモジュールimplementation1コンパニオンオブジェクト/ファクトリを別のサブモジュールに実装

、私はこの

object Matrix extends MatrixInstance { ... } 

コンパニオンを実装したいと思います。

ここで考えているのは、2番目の実装を選択した場合、ライブラリユーザーはlibraryDependencies += ...implementation1からimplementation2に変更することができるということです。

ただし、これは機能していないようです。つまり、オブジェクトのように見え、それはコンパニオンが同じモジュール(ファイル?)になければならないということです。それ以外の場合、私は循環依存関係を取得し、scalacは失敗します。

この機能を実現するために使用できるパターンはありますか?ファクトリ/コンパニオンオブジェクトのインタフェース特性を定義し、それを個別のアーチファクトに実装させ、次にユーザがlibraryDependenciesを変更するだけで実装間で選択できるようにするか、

答えて

0

ファイルが異なる必要がある場合は、Matrixとは呼ばないでください。たとえば、matrixのように名前を付けることができます。コンパニオンオブジェクトではないため、Matrixに関連する暗黙検索には自動的に含まれませんが、必要に応じていつでもインポートできます。これは拡張機能を提供型のクラスのある例として、Scalazと猫の両方がSTDLIB List用型クラスのインスタンスと構文の数が含まれているlistオブジェクトを持って

、例えば、あなたのようなhttps://github.com/scalaz/scalaz/blob/v7.2.11/core/src/main/scala/scalaz/std/List.scala

+0

が言います、メソッド(すなわち、機能性)を使用することができます。たとえば、猫では、あなたはまだ例を書いています。 'option(2)'ではなく、 'option(2)'を使ってデータ型を作成します。私がここで変更しようとしているのは、代数ではなく 'Option'の実装です。 – Luciano

+0

これはあなたが提案しているとは思えませんが、元のコンパニオンオブジェクトを拡張するtypeclassを作成することは可能かもしれません。例えば'暗黙のクラスMatrixImpl1(val companion:Matrix.type){def apply()...}'それがうまくいけば(コンパニオンオブジェクトを拡張する) – Luciano

関連する問題