It was my impression that extending to Object is handled as a special case - much like extend-type default in ClojureScript.
On Fri, May 10, 2013 at 6:06 PM, Alan Malloy <a...@malloys.org> wrote: > Even when the interface and class you've extended them to are related by > inheritance? I thought the most-derived implementation was chosen, and only > when there's a "tie" like a class that implements two unrelated interfaces, > both of which have had the protocol extended to them. If it were completely > undefined, all sorts of useful idioms would become untenable. For example, > you couldn't extend a protocol to Object and also to various other classes. > Dave's scenario is like this, in which TUnion is more-derived than TBase, > and so as far as I know should always "win" in the polymorphic dispatch. > Reading through core_deftype's functions 'pref and 'find-protocol-impl seem > to support this assertion; am I missing something? > > On Friday, May 10, 2013 2:20:31 PM UTC-7, Stuart Sierra wrote: >> >> When you extend a protocol to multiple Java interfaces / abstract >> classes, then call the methods on an instance which implements/extends more >> than one of those, the result is *undefined*. >> >> The problem is that this permits multiple inheritance of concrete >> behavior, the reason Java doesn't allow multiple base classes. >> >> Protocols do not (currently) have any mechanism to "prefer" one method >> implementation over another. >> >> In general, I recommend extending protocols only to concrete types, not >> interfaces. >> >> -S >> >> >> On Friday, May 10, 2013 4:45:57 AM UTC+10, Dave Kincaid wrote: >>> >>> I've not worked with protocols much, but saw a good fit recently. >>> However, I'm a little bit unsure about this situation. I have some Thrift >>> objects that I'd like to be able to easily unpack into maps, so I created a >>> protocol >>> >>> (defprotocol Unpackable >>> (unpack [x])) >>> >>> Thrift has two main data types - structs and unions that need to be >>> handled differently. Structs always implement the interface TBase. Unions >>> extend the abstract class TUnion which in turn implements the interface >>> TBase. So I'm extending my protocol to these types like this: >>> >>> (extend-protocol IUnpackable >>> TUnion >>> (unpack [x] (unpack-union x)) >>> >>> TBase >>> (unpack [x] (unpack-struct x (get-meta-data (class x))))) >>> >>> It all seems to work correctly, but I'm a little unsure that it is >>> guaranteed to work especially in the case of a union. Since a union extends >>> TUnion, but also implements TBase will a call to (unpack the-union) do the >>> right thing (go to unpack-union instead of unpack-struct) every time? >>> >>> Thanks. >>> >> -- > -- > You received this message because you are subscribed to the Google > Groups "Clojure" group. > To post to this group, send email to clojure@googlegroups.com > Note that posts from new members are moderated - please be patient with > your first post. > To unsubscribe from this group, send email to > clojure+unsubscr...@googlegroups.com > For more options, visit this group at > http://groups.google.com/group/clojure?hl=en > --- > You received this message because you are subscribed to the Google Groups > "Clojure" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to clojure+unsubscr...@googlegroups.com. > For more options, visit https://groups.google.com/groups/opt_out. > > > -- -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups "Clojure" group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/groups/opt_out.