虽然使用'derive'生成的层次结构允许每个子类有多个父类,但无法表明这些父类之间的优先顺序,除非通过为每个类型X的每种多方法逐个指定'prefer-method'。当两个多方法都适用于提供的参数时,Clojure会生成一个仅包含错误字符串的非具体IllegalArgumentException。所有这些都意味着尽管Clojure有类似的“继承”机制作为事先构建的层次结构,但目前实际上无法通过事先构建的层次结构机制实现多重继承。"Prefer-method"不能扩展到在具有复杂类型层次结构和大量使用多方法的复杂应用程序中应用。
一些可能的解决方案是
- 允许'defmulti'接受一个'tie-breaker'函数(tie-breaker (link: arglist speclist1 speclist2) ...),而不是引发IllegalArgumentException,并且必须返回'winning speclist'。
- 而不是引发IllegalArgumentException,引发一个TiedMultiMethodsException -- 异常实例应包含违规的spec列表、函数和提供的参数。
- 当使用'derive'时允许指定优先级(如果是通过"最后一位最高优先级"规则的话)。
Paul