2017-02-24 9 views
3

私は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番目のプロトコルコードを何らかの形で実行すると、何とか最初のものと干渉します。

最終的には、これらのクラスのメソッドに多型ラッパー関数を書きたいと思いますが、これをできるだけ簡単かつきれいに行う方法はわかりません。助言してください...

+1

は、RealDistributionとIntegerDistributionを別々に扱わなければならないようです。これは、Apacheのコモンズ・マスに共通の祖先がないからです。私はこれがクロージャーでどのように策定されているのか分かりませんが、基本的な考え方は、それら2つを別々にすることです。 – borowis

+0

私はそれらを別々に扱います。しかし、RealDistributionを拡張した後でIntegerDistributionを拡張すると、RealDistributionをやりとりしてエラーを表示します。 – Lindon

答えて

1

両方のインターフェイスを実装するクラスがある場合は問題がありますが、書いた内容は問題ありません。

なぜあなたはそれがあなたのために働いていないと言う:あなたは本当ですか?実際にはIntegerDistributionにはdensityという引数がありません。実際にはというプロトコルではなく、スタックオーバーフローの問題を特定する際にエラーが発生したかどうかを確認するエラーメッセージが表示されます。

+0

あなたは正しいです、私は最小の例を作成しようとするとエラーが発生しました。しかし、問題は続く。私はより具体的な詳細と投稿を更新します – Lindon

+0

元のポストより詳細を更新 – Lindon

関連する問題