Thank you for your in-depth answer! My problem is that in this case, the sub-interfaces are actually very distinct from each other and it would make sense to have separate namespaces for them. So, SubElementA is really very different from SubElementB. Ironically the same API has another inheritance hierarchy where it indeed makes sense to do the opposite and only provide one namespace because those interfaces are thematically very similar to each other.
The main reason for re-exposing the base interface methods was that somebody who works with my wrapper wouldn't have to remember that SubElementA and SubElementB are extensions of a base Element interface. So in a sense there would be less of a 'cognitive overhead' for him or her, and one fewer namespace to import. On your suggestions about Clojure-ifying the wrapper: I'm actually working on another library that does this, and depends on the wrapper library in question. Again, thank you very much for taking the time to answer my question. On Tuesday, May 6, 2014 4:54:23 PM UTC+2, Alex Miller wrote: > > > On Tuesday, May 6, 2014 6:53:51 AM UTC-5, f...@kimchi.io wrote: >> >> Disclaimer: I'm new to Clojure programming. >> > > Welcome! > > >> I work on some Clojure wrapper functions for a Java API that mainly >> consists of interfaces. >> >> I wonder what the 'usual way of doing things' is regarding inheritance >> chains. >> >> Let's say there's an interface called *Element* that has a >> *getId()*function. A second interface, called >> *SubElement,* extends *Element*. I have two clojure namespaces for these >> two interfaces: *foo.element* and *foo.sub-element*. >> > > I suspect you probably don't actually need two namespaces for this, but it > depends on the api and your wrapping needs. > > In foo.element there is a wrapper for the getId() function: >> >> (defn get-id >> [^Element element] >> (.getId element)) >> > > ok > > >> >> Now my question is regarding foo.sub-element. Should I just redefine >> get-id in there? >> >> (defn get-id >> [^SubElement element] >> (.getId element)) >> > > There is no reason to do this - your prior get-id is fine. A SubElement is > an Element and Java turns these into the same virtual call either way. > > >> >> Or should I do: >> >> (defn get-id >> [^Element element] >> (element/get-id element)) >> > > There is no need to wrap a function like this. > > >> Or should I use potemkin in there? >> >> (potemkin/import-fn element/get-id) >> > > And I definitely wouldn't go to potemkin for this. > > >> Or should I not re-wrap this function call and work with both namespaces >> when dealing with SubElements? >> > > When you need to get the id, call the function in the element ns. If you > need something SubElement specific, call the functions in sub-element. You > may find that all of the functions in both ns'es could really go in Element. > > You may also consider not wrapping the api directly but instead > transforming your Java objects into Clojure data, working with it, then > transforming it back to Java if needed. There are obvious costs with > transformation and memory so this only sometimes makes sense, can't say > without knowing more about the API and the usage of it. One quick-and-dirty > tool for this is the "bean" function which takes a Java object and returns > a Clojure map based on it's "bean" properties (get*, is*). > > In general, rather than having explicit getter functions, Clojure > information entities (as maps or records) typically use keywords as keys > (the "fields" of the entity) and leverage the ability of keywords to invoke > themselves on a map as a getter function. I mention this because to take > advantage of this common pattern, you would need to do the transformation > from Java object to Clojure map/record. Again, hard to say whether that > makes sense for you. > > > >> >> What are the pros and cons to these different approaches? 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/d/optout.