2011-05-19 32 views
12

Örneğin, aşağıdaki gibi bir Java sınıfı verilir: Clojure'da bir Java sınıfını aşırı yüklenmiş yöntemlerle nasıl proxy edebilirim?

public class Foo { 
    public String bar(String x) { 
    return "string " + x; 
    } 
    public String bar(Integer x) { 
    return "integer " + x; 
    } 
} 

Foo'nun Clojure alt sınıfını nasıl alt sınıflara ayırabilirim ve yalnızca çubuk (String) yöntemini geçersiz kılabilir, ancak orijinal Foo sınıfındaki çubuğu (Tamsayı) yeniden kullanabilirim. Böyle bir şey (ama bu işe yaramaz):

(let [myFoo (proxy [Foo] [] 
       (bar [^String x] (str "my " x)))] 
    (println "with string: " (.bar myFoo "abc")) 
    (println "with integer: " (.bar myFoo 10))) 

Bu örnekte şunlar gösterilecektir:

with string: my abc 
with integer: my 10 

fakat bunun etkilerini öğrenmek istiyorum:

with string: my abc 
with integer: integer 10 
+0

Cevabım yok, ama sorunuz beni biraz daha akıllı hale getiren "proxy_core.clj" yi okumam için beni teşvik etti, teşekkürler! :) –

+0

Aslında aynısını yaptım. Başka biri ilgilenirse proxy_core.clj' [burada] (https://github.com/clojure/clojure/blob/master/src/clj/clojure/core_proxy.clj). –

cevap

3

Ben Bunu tahmin etmek istediğinizi değil, ama bu arada, bağımsız değişkenin türünü açıkça kontrol edebilir ve Foo'daki orijinal yöntemi çağırmak için proxy-super'u kullanabilirsiniz.

(let [myFoo (proxy [Foo] [] 
       (bar [x] 
       (if (instance? String x) 
        (str "my " x) 
        (proxy-super bar x))))] 
    (println "with string: " (.bar myFoo "abc")) 
    (println "with integer: " (.bar myFoo 10))) 
+0

Aslında tam olarak bunu denedim ama AbstractMethodError ve diğer garip şeyleri alıyordum (bunu yaptığım gerçek örnek elbette çok daha karmaşık). Tekrar denemek zorundayım. Teşekkürler! –

+0

@ alex-miller Ve Tamsayı çubuğunun dize çubuğuna geri çağırması durumunda dikkatli olmalısınız. Bu, bu yaklaşımla da çalışmayacak. Ama jonathan-tran haklı: Bunu yapmanın tek yolu bu. – kotarak

İlgili konular