私はApache Commons Math3ライブラリの機能にかなり依存しているClojureにいくつかのコードを書いています。以前はJavaコードを書いたことはありませんでした。私が頻繁に使用するいくつかのclojureラッパーを作成するための洗練されたソリューションを考え出しています。うまくいけば、私は実際にOOPやJavaの専門家ではないにもかかわらず、私がやろうとしていることを伝えることができます。具体的な簡単な例を使って課題を説明します。Java用Clojureの多型インタフェースを実装するクラス - ラッパー記述
一般に、私は与えられたインタフェースからいくつかのメソッドを継承するjavaクラスのコレクションを持っています。具体的な例を示すには、distributionsパッケージを検討してください。 3つのインタフェースがあり、そのうちの1つはRealDistributionです。 RealDistributionインターフェイスを継承するクラスは、「密度」などのいくつかのメソッドにアクセスできます。
Clojureので、私は
(.density (new NormalDistribution 0 1) 2)
(.density (new ExponentialDistribution 1) 2)
目標は異なる分布、自身のJavaクラスにディスパッチするポリモーフィック機能「密度」を書くことで行うことができます。
Iは密度-evalの
(defprotocol density-eval
(density [distribution x]))
それを呼んで、プロトコルを記述し、手動しかし、私はすべてのディストリビューションのためにこれを行う必要があり
(extend-type NormalDistribution
density-eval
(density [d x] (.density d x)))
のように、各ディストリビューションを拡張...そしてtheresの可能性それらの多くは...そしてコードは各分布について同一です。
時間を節約するために、私がしたいのはもっと一般的なもの、つまりNormalDistributionの親タイプですが、ここからどこに行くのかはわかりません。私が現在持っていることは正規分布とExponentialDistributionが実装するインターフェイスであること
(extend-type RealDistribution
density-eval
(density [d x] (.density d x)))
RealDistributionです。そして、これはうまくいきます...私は、RealDistributionインターフェースを実装する多くのディストリビューションy(密度y x)を呼び出すことができます。例えば(密度(新しいNormalDistribution 0 1)0)はうまく動作します。しかし、これの問題は、IntegerDistributionインターフェイスを実装するクラスで同じゲームをプレイすることです。私は
(defprotocol pmf-eval
(pmf [distribution x]))
(extend-type IntegerDistribution
pmf-eval
(pmf [d x] (.probability d x)))
、その後、私は(PMF(新しいポアソン分布3)2)のようなものを行うことができますIntegerDistributionインタフェースを実装し、それが出て正常に動作します...クラスのためのが、その後私はできなくなったコール新しいプロトコルを定義しますRealDistributionインターフェースを実装しているディストリビューションのy(密度yx)。
レプリケーションで2番目のプロトコルコードを何らかの形で実行すると、何とか最初のものと干渉します。
最終的には、これらのクラスのメソッドに多型ラッパー関数を書きたいと思いますが、これをできるだけ簡単かつきれいに行う方法はわかりません。助言してください...
は、RealDistributionとIntegerDistributionを別々に扱わなければならないようです。これは、Apacheのコモンズ・マスに共通の祖先がないからです。私はこれがクロージャーでどのように策定されているのか分かりませんが、基本的な考え方は、それら2つを別々にすることです。 – borowis
私はそれらを別々に扱います。しかし、RealDistributionを拡張した後でIntegerDistributionを拡張すると、RealDistributionをやりとりしてエラーを表示します。 – Lindon