对于使用 Java 和 C# 等静态类型语言进行编码的人来说,单次分派问题最为熟悉。基本思想是:
而运行时多态性允许我们根据 的类型(运行时类型)调度到正确的方法调用receiver
,例如:
IAnimal mything = new Cat();
mything.chop();
方法调用会根据 的运行时类型进行mything
,即Cat
. 这是单一的分派能力(存在于 Java/C# 中)。
现在,如果您不仅需要在接收器的运行时类型上进行分派,而且还需要在(多个)参数的类型上进行分派,那么您将面临一个小问题:
public class MyAcceptor {
public void accept (IVisitor vst) {...}
public void accept (EnhancedConcreteVisitor vst) {...}
}
第二种方法永远不会被调用,因为在我们的“消费者”代码中,我们只是倾向于通过它们共同的超类型或接口来处理不同类型的对象(在我的示例中是访问者)。
这就是我问的原因——因为动态类型允许多重分派多态性,而 C# 4.0 具有动态关键字;)