2012-01-30 20 views
9

Estoy tratando de crear una clase que amplíe la corriente de entrada Clojure a través de gen-class. Si quiero invocar el método de la clase padre, ¿cómo hago eso?¿Cómo invocar el método de superclase en un método de clase gen de Clojure?

+1

Esta es una vieja pregunta, pero a veces llama la atención. FWIW, como he usado Clojure a lo largo de los años, he descubierto que si creo que necesito el poder de gen-class para hacer algo como esto, es más fácil escribir un poco de Java. – Bill

Respuesta

11

De (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. 

Por lo tanto, con el fin de ser capaz de llamar al método de los padres fooBar, que diría

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

Luego de implementar fooBar:

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

Además de la instalación de :gen-class proporcionada por ns formas, existe una gen-class macro.

+2

Gracias por la respuesta y la información adicional en la edición. La adición del the. en la invocación es un detalle importante. – Bill

1

Esta no es una respuesta a su pregunta real, pero tengo una pequeña biblioteca que le permite fingir que InputStream es una interfaz en lugar de una clase (para que no necesite gen-class en absoluto). Consulte io.core.InputStream, que le permite reificar io.core.InputStreamable y obtener un InputStream personalizado. Los campos de instancia que necesite pueden ser locales cerrados por reify.

+0

Interesante idea. Había pensado en algo así, pero en última instancia quiero un flujo de entrada en caso de que quiera devolvérselos a Java. – Bill

+0

El punto es que obtienes un flujo de entrada. Usted crea un InputStreamable que describe su lógica, y le da a InputStream, una clase AOTed Java. Por ejemplo, '(InputStream. (Reify InputStreamable (read ...) (skip ...)))'. – amalloy

+0

@Bill Olvidé a @ en el comentario anterior. Creo que eso significa que no te notificaron; disculpas si ahora recibes una segunda notificación. – amalloy

Cuestiones relacionadas