2012-01-30 15 views
9

Giriş akışı Clojure öğesini gen-class aracılığıyla genişleten bir sınıf oluşturmaya çalışıyorum. Ebeveyn sınıfının yöntemini çağırmak istersem, bunu nasıl yaparım?Clocure gen sınıfı yönteminde süper sınıf yöntemi nasıl çalıştırılır?

+1

Bu eski bir sorudur, ancak bazen dikkat çeker. FWIW, yıllar boyunca Clojure'ı kullandığım gibi, böyle bir şey elde etmek için gen sınıfının gücüne ihtiyacım olduğunu düşünürsem, sadece biraz Java yazmak daha kolay olur. – Bill

cevap

11

(doc gen-class) Gönderen:

: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. 

Yani, ebeveynin fooBar yöntemini çağırmak edebilmek için, size Ardından uygulamaya

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

söyleyebilirim fooBar:

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

ns formları tarafından sağlanan :gen-class tesisine ek olarak

, makro bir gen-class yoktur.

+2

Düzenleme içindeki yanıt ve ek bilgiler için teşekkürler. Eklenmesi. Çağırmada önemli bir ayrıntıdır. – Bill

1

Bu, asıl sorunuzun bir cevabı değildir, ancak InputStream'in bir sınıf yerine bir arabirim olduğunu düşünmenize izin verecek küçük bir kütüphaneye sahibim (böylece gen sınıfına ihtiyacınız yoktur). io.core.InputStreamable'u yeniden tanımlamanıza ve özelleştirilmiş bir InputStream çıkarmanıza olanak veren io.core.InputStream numaralı telefonu inceleyin. İhtiyaç duyduğunuz örnek alanlar, yalnızca reify tarafından kapatılan yerliler olabilir.

+0

İlginç bir fikir. Böyle bir şey hakkında düşünmüştüm, ama sonunda bunları Java'ya geri vermek istesem bir giriş akışı istiyorum. – Bill

+0

Tüm nokta, bir giriş akışı almanızdır. Mantığınızı açıklayan bir InputStreamable yaratırsınız ve bunu AOTed Java sınıfı olan InputStream'e verirsiniz. Örneğin, (InputStream. (InputStreamable (oku ...) (atla ...))). – amalloy

+0

@Bill Önceki yorumunuzda @ unuttunuz. Bence bu, bildirim almadığınız anlamına gelir; Şimdi ikinci bir bildirim alıyorsanız özür dilerim. – amalloy

İlgili konular