语境

我已经在Java编程了几年。 ATM我正在学习完全不同的东西:Clojure。可以通过使用多方法来解决表达问题,而在Java中,您将需要访问者模式或类似的东西之类的东西。

问题

我一直在阅读有关MultimeThods的信息,并且与方法过载的实际差异很混乱。

到目前为止,我发现的唯一区别不取决于调用该方法的对象的运行时类型。

有帮助吗?

解决方案

过载是当两个或多个方法具有相同名称但不同的签名(不同的参数类型,不同数量的参数)时。超载在静态上解决,仅取决于参数的静态类型。 (例如,在Java中超负荷和覆盖的相互作用使故事变得更加复杂)。超负荷可以静态解决特定方法签名。然后在运行时,动态调度将选择具有该签名的最合适的方法。

多方法是具有相同名称,相同数量参数和的方法集合 重叠 类型签名。每当对多方法进行呼叫(使用多途径的名称)时,集合中的所有方法都被视为派遣的可能候选者。根据参数的运行时类型选择精确的候选人 - 选择了最具体的方法。所有参数的实际运行时类型都用于确定运行哪一个,该操作与Java中的传统单个调度不同,其中仅使用该方法的第一个参数(目标)来确定运行哪个方法主体。

其他提示

就我的理解而言,

多方法是方法多态性的概括。

一个多方法由2个部分组成

  1. 一个名字

  2. 一个 dispatch method: :将产生一个 dispatch value

基于此调度值,将选择适当的方法。超载是多方法的特殊情况,调度方法将静态类型作为调度值返回静态类型

通常,调度方法可以是任何东西。它可以返回类型以外的其他值。

许可以下: CC-BY-SA归因
不隶属于 cs.stackexchange
scroll top