2012-01-30 66 views
9

Tôi đang cố gắng tạo một lớp mở rộng luồng đầu vào Clojure qua gen-class. Nếu tôi muốn gọi phương thức của lớp cha, làm cách nào để thực hiện điều đó?Làm thế nào để gọi phương thức của siêu lớp trong một phương thức lớp gen Clojure?

+1

Đây là một câu hỏi cũ, nhưng đôi khi nó được chú ý. FWIW, như tôi đã sử dụng Clojure trong những năm qua, tôi đã thấy rằng nếu tôi nghĩ rằng tôi cần sức mạnh của gen-class để có được một cái gì đó như thế này được thực hiện, nó dễ dàng hơn chỉ để viết một ít Java. – Bill

Trả lời

11

Từ (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. 

Vì vậy, để có thể gọi phương thức của cha mẹ fooBar, bạn muốn nói

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

Sau đó, để thực hiện fooBar:

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

Ngoài các cơ sở :gen-class cung cấp bởi ns hình thức, có một gen-class vĩ mô.

+2

Cảm ơn câu trả lời và thông tin bổ sung trong bản chỉnh sửa. Việc bổ sung các. trong lời gọi là một chi tiết quan trọng. – Bill

1

Đây không phải là câu trả lời cho câu hỏi thực tế của bạn, nhưng tôi có một thư viện nhỏ để cho bạn giả vờ InputStream là một giao diện thay vì một lớp (để bạn không cần lớp gen). Hãy xem io.core.InputStream, cho phép bạn chỉnh sửa io.core.InputStreamable và nhận ra một InputStream tùy chỉnh. Bất cứ trường nào bạn cần chỉ có thể là người dân địa phương đóng cửa bởi reify.

+0

Ý tưởng thú vị. Tôi đã nghĩ về một cái gì đó như thế, nhưng cuối cùng muốn một dòng đầu vào trong trường hợp tôi muốn đưa những thứ này cho Java. – Bill

+0

Toàn bộ vấn đề là bạn nhận được luồng đầu vào. Bạn tạo một InputStreamable mô tả logic của bạn và đưa nó vào InputStream, một lớp Java AOTed. Ví dụ, '(InputStream. (Reify InputStreamable (đọc ...) (bỏ qua ...)))'. – amalloy

+0

@Bill Quên @ bạn trong bình luận trước. Tôi nghĩ điều đó có nghĩa là bạn không được thông báo; xin lỗi nếu bạn hiện đang nhận được thông báo thứ hai. – amalloy

Các vấn đề liên quan