虽然使用'derive'产生分层允许每个子类有多个父类,但没有办法表明这些父类之间的优先级,除非为每个类型X和每个多重方法辛苦地指定'prefer-method'。当两个多重方法都可以应用于提供的参数时,Clojure会产生一个非特定的IllegalArgumentException,其中只包含一个错误字符串。所有这一切意味着虽然Clojure确实存在“继承”机制,即自创分层,但是目前实际上无法使用自创分层机制实现多继承。'Prefer-method' 在大型应用程序、复杂类型分层和多重方法的复杂使用中无法扩展。
一些可能的解决方案包括
- 允许'defmulti'接受一个'tie-breaker'函数(tie-breaker(链接:arglist speclist1 speclist2)...),在抛出IllegalArgumentException而不是调用抛出的时候被调用,并且必须返回'获胜的speclist'。
- 不要抛出IllegalArgumentException,而是抛出一个TiedMultiMethodsException -- 异常实例应包含违规的speclists、函数和提供的参数。
- 允许在'derive'中使用时指定优先级(如果只有“后进先出=最高优先级”规则的话)。
Paul