虽然使用'derive'生成的层次结构允许每个子类有多个父类,但无法表明这些父类之间的优先级,除非通过为每个类型X的每个多重方法艰难地指定'prefer-method'。当两个多重方法都适用于提供的参数时,Clojure会产生一个不带任何错误字符串的、非特定的IllegalArgumentException。所有这些都意味着Clojure虽然具有类似“继承”机制的自定义层次结构,但实际上目前在自定义层次结构机制中使用多重继承还不切实际。'Prefer-method'不具备扩展到用于具有复杂类型层次结构和多重方法频繁使用的大型应用的能力。
解决此问题的潜在方法包括:
- 允许'defmulti'接受一个'tie-breaker'函数(tie-breaker (详情: arglist speclist1 speclist2) ...),在抛出IllegalArgumentException期间被调用,并返回'winning speclist'。
- 在抛出IllegalArgumentException的情况下,抛出TiedMultiMethodsException -- 异常实例应包含有问题的speclists、函数以及提供的参数。
- 在使用'derive'时允许指定优先级(如果只有“后进来的是的最高优先级”规则的话)。
Peter