Giả sử tôi có hai giao thức:Làm cách nào để bạn có thể mở rộng giao thức Clojure sang giao thức khác?
(defprotocol A
(f [this]))
(defprotocol B
(g [x y]))
Và tôi muốn mở rộng giao thức B cho tất cả các trường hợp có hỗ trợ giao thức A:
(extend-protocol A
String
(f [this] (.length this)))
(extend-protocol B
user.A
(g [x y] (* (f x) (f y))))
Động lực chính là để tránh phải mở rộng B riêng biệt cho tất cả các lớp có thể mà A có thể được mở rộng, hoặc thậm chí đến các lớp tương lai chưa biết mà người khác có thể mở rộng A (ví dụ: nếu A là một phần của API công khai).
Tuy nhiên điều này không làm việc - bạn sẽ có được một cái gì đó như sau:
(g "abc" "abcd")
=> #<IllegalArgumentException java.lang.IllegalArgumentException:
No implementation of method: :g of protocol: #'user/B found for
class: java.lang.String>
Đây có phải là có thể ở tất cả? Nếu không, liệu có cách giải quyết hợp lý để đạt được cùng một mục tiêu không?
Cảm ơn. Tôi nghĩ đây là cách tiếp cận tốt nhất trong trường hợp của tôi - sự tương tự với thư viện trình tự hoạt động tốt ở đây! – mikera