2012-01-30 58 views
9

我試圖創建一個類,通過gen-class擴展輸入流Clojure。如果我想調用父類的方法,我該怎麼做?如何在Clojure gen-class方法中調用超類的方法?

+1

這是一個古老的問題,但有時它會得到關注。 FWIW,正如我多年來一直使用Clojure一樣,我發現如果我認爲我需要gen-class的強大功能來完成這樣的事情,那麼只需編寫一點Java就簡單多了。 – Bill 2017-04-02 20:03:54

回答

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)) 

:gen-class設施提供的ns表單外,還有一個gen-class宏。

+2

感謝您的答案和編輯中的其他信息。該添加的。在調用中是一個重要的細節。 – Bill 2012-01-30 13:12:24

1

這不是你的實際問題的答案,但我有一個小庫讓你假裝InputStream是一個接口而不是一個類(所以你根本不需要gen-class)。請查看io.core.InputStream,它可以讓您通知io.core.InputStreamable並獲得自定義的InputStream。無論您需要哪種實例字段,都可以通過reify關閉當地人。

+0

有趣的想法。我曾經想過類似的東西,但最終還是希望有一個輸入流,以防我想將這些輸入流交給Java。 – Bill 2012-01-30 13:08:27

+0

重點在於你確實得到了一個輸入流。您創建一個描述您的邏輯的InputStreamable,並將其提供給InputStream,一個AOTed Java類。例如'(InputStream。(reify InputStreamable(read ...)(skip ...)))'。 – amalloy 2012-01-30 18:18:08

+0

@Bill在先前的評論中忘記了@你。我認爲這意味着你沒有得到通知;如果您現在正在收到第二次通知,請致歉。 – amalloy 2012-01-30 19:40:23