2012-01-30 21 views
9

入力ストリームClojureをgen-class経由で拡張するクラスを作成しようとしています。親クラスのメソッドを呼び出す場合、どうすればいいですか?Clojure gen-classメソッドでスーパークラスのメソッドを呼び出す方法は?

+1

これは古い質問ですが、時には注意を喚起します。 FWIWは、私が何年もClojureを使ってきたように、このようなことをするためにgen-classの力が必要だと思ったら、ちょっとだけJavaを書く方が簡単です。 – Bill

答えて

11

(doc gen-class) から:

:exposes-methods {super-method-name exposed-name, ...} 

It is sometimes necessary to call the superclass' implementation of an 
overridden method. Those methods may be exposed and referred in 
the new method implementation by a local name. 

だから、親のfooBarメソッドを呼び出すことができるようにするために、あなたが次に実装する

(ns my.custom.Foo 
    (:gen-class 
    ; ... 
    :exposes-methods {fooBar parentFooBar} 
    ; ... 
    )) 

言うと思いますfooBar

(defn -fooBar [this] 
    (combine-appropriately (.parentFooBar this) 
         other-stuff)) 

nsフォームで提供される:gen-class機能に加えて、gen-classマクロがあります。

+2

答えとその編集に関する追加情報をありがとう。の追加。呼び出しの重要な詳細です。 – Bill

1

これはあなたの実際の質問に対する回答ではありませんが、InputStreamがクラスではなくインターフェイスなので、ジェネラルクラスを全く必要としないようにするライブラリがあります。 io.core.InputStreamを調べて、io.core.InputStreamableを整理し、カスタマイズされたInputStreamを入手することができます。必要なインスタンスフィールドはどれも、reifyによって閉じられたローカルの人に過ぎません。

+0

面白い考え。私はそのようなことについて考えていましたが、これらをJavaに戻したい場合は入力ストリームが必要です。 – Bill

+0

全体的なポイントは、入力ストリームを取得することです。ロジックを記述するInputStreamableを作成し、それをAOTed JavaクラスのInputStreamに渡します。例えば、(InputStream。(InputStreamable(read ...)(skip ...))) ')。 – amalloy

+0

@Bill前のコメントで@ youを忘れてしまった。私はあなたが通知されなかったことを意味すると思います。今や第2の通知を受け取っていれば謝罪します。 – amalloy

関連する問題