Yeah... I actually wanted to avoid that - I don't really want to 
(publically) 'expose' them. It means I have to expose all arity-overloaded 
methods I want to use, and in some libraries, there are quite a lot of 
these. It just feels a bit weird to publically expose (protected) methods 
of superclasses - well, we're using classes here, so I do think in 
inheritance-based oop for this example.

Anyway, exposing is probably how to do it...

thanks, qsys

Op maandag 28 december 2015 04:22:36 UTC+1 schreef James Elliott:
>
> I don’t have a ton of experience with gen-class, but I think you need to 
> tell it to expose the superclass methods you want to call using 
> :exposes-methods, as described in 
> http://stackoverflow.com/questions/9060127/how-to-invoke-superclass-method-in-a-clojure-gen-class-method
>
> In case it is of any use, here is an example of where I successfully 
> subclassed a Java class from an external library and called some superclass 
> methods: 
> https://github.com/brunchboy/afterglow-max/blob/master/src/afterglow/max/Var.clj
>
> On Wednesday, December 23, 2015 at 3:23:41 AM UTC-6, Kurt Sys wrote:
>>
>> When using gen-class and arity-overloaded methods of a superclass seems 
>> not very obvious, or I am missing something...
>>
>> There's a (java) superclass 'some.Superclass' (which is from a library, 
>> so I can't change this one):
>>
>> public abstract class Superclass {
>>    public void method() {
>>    }
>>
>>    public void method(Object something) {
>>       this.method();
>>       // other logic
>>    }
>> }
>>
>>
>> I want to extend that base (abstract) class in clojure, using gen-class 
>> (since the class needs to accessible as a normal Java class). So the first 
>> thing I did was:
>>
>> (ns my.namespace
>>   (:gen-class
>>    :name "my.namespace.ArityTest"
>>    :extends some.Superclass
>>    :prefix "some-")
>>  )
>>
>> (defn some-method
>>   [this]
>>   (println "1-arity"))
>>
>> However, this doesn't work: 'method' is arity-overloaded, when calling 
>> new ArityTest().method(new Object())
>>
>> I get a ArityException, wrong number of arguments (2). I suppose this is 
>> because I override 'method', so I have to override all arities? I'd like to 
>> have the 1-arity version to call it's superclass method, and I seem to fail 
>> at that. The last attempt is this: get the method of the superclass and 
>> call that method on 'this':
>>
>> (ns be.admb.kbf.vertx.shell.test
>>     (:gen-class
>>       :name "my.namespace.ArityTest"
>>       :extends some.Superclass
>>       :prefix "some-")
>>     )
>>
>>
>> (defn some-method
>>       ([this]
>>         (println "1-arity"))
>>       ([this o]
>>         (.invoke (-> this
>>                      (.getClass)
>>                      (.getSuperclass)
>>                      (.getMethod "method"
>>                                  (into-array Class [java.lang.Object])))
>>                  this (into-array Object [o]))
>>         ))
>>
>> This fails: it calls the overriden method, not the superclass' method... 
>> (and the method keeps on calling itself).
>>
>> The question: how do I override only 1 method of an arity-overloaded 
>> method of a superclass in Clojure (using gen-class to generate a Java 
>> class)?
>>
>

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to