oop - 多重分派(dispatch)和方法重载有什么区别?

标签 oop

在像 Scala 这样的语言中,可以通过更改参数的数量和/或方法的参数类型来为一个方法名称定义多个定义。这称为方法重载。

这与多分派(dispatch)有何不同?

谢谢

最佳答案

方法重载在编译时解决。
多分派(dispatch)在运行时解决。
当使用双重分派(dispatch)时,被调用的方法取决于接收者和参数的实际类型。然而,方法重载只允许被调用的方法依赖于参数的声明类型。为什么? Java 在编译时将方法调用与它们的完整签名绑定(bind)(早期绑定(bind))。完整签名包括所有参数类型,因此当参数的实际类型在运行时不同(多态)时,重载不会像您预期的那样工作!

void add(Foo o) { ... }
void add(Bar o) { ... }
void client() {
    Foo o = new Bar();
    add(o); // calls add(Foo) not add(Bar)!
}
但是使用多次调度
void add(Foo o) { o.dispatch(this); }
void add(Bar o) { o.dispatch(this); }
void client() {
    Foo o = new Bar();
    add(o); // calls #dispatch as defined in Bar!
}
Scala 中的情况可能略有不同,但一般区别应该与此处在所有编程语言中呈现的相同。

关于oop - 多重分派(dispatch)和方法重载有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1801216/

相关文章:

ios - 从子调用父方法?

c# - 在此生产计划示例中,这种使用 Dictionary<enum,object> 的方式是否正确?

java - 使用具有相同方法的两个接口(interface)实现多重继承

php - 获取父类中子类的实例

java - 带有继承的类的 Hibernate 映射

c++ - 在 Vector 中插入特定项目

java - 获取文件中两个字符之间的所有子字符串

java - 如何使用 javax.xml.stream 接口(interface) XMLStreamWriter 接口(interface)写入 boolean 值

php - 在子 PHP 之后自动调用父构造函数

java引用不在范围内的对象