最近,我問爲什麼的接口和協議可以用Clojure來實現不完全:clojure的延伸信息是什麼?真的給我?
user=> (defprotocol P (foo [self]))
P
user=> (extend-type Long P)
nil
user=> (extends? P Long)
true
user=> (foo 1)
IllegalArgumentException No implementation of method: :foo of protocol: #'user/P found for class: java.lang.Long clojure.core/-cache-protocol-fn (core_deftype.clj:527)
,被告知,這是互操作的原因,它也不會在實踐中的問題。當然。
但顯然extends?
真的告訴我任何關於協議和類之間的關係:正如(extends? P C)
並不意味着我可以在C類的對象調用foo
,(not (extends? P C))
並不意味着我不能對對象調用foo
C類:
user=> (defprotocol P (foo [self]))
P
user=> (extend-type Object P (foo [self] 1))
nil
user=> (extends? P Long)
false
user=> (foo 1)
1
現在我感到應該什麼樣的信息extends?
給我... satisfies?
,另一方面很困惑,正確處理第二種情況,但不是第一個。
當然,我去看了一下代碼,但是我真正在尋找的是更多的「我可以期望什麼樣的行爲,當被問及是否擴展協議時,回答yes」。 – antony
您可以預期該類型已經擴展並實現了協議方法(希望遵循良好的編碼規範和實現協議的每種方法),因此在實現特定協議方法的情況下調用該類型的對象上的協議方法應該可以工作按類型 – Ankur