多重调度和方法重载有什么区别?

问题描述 投票:0回答:1

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

这与多次调度有何不同?

oop overloading multiple-dispatch
1个回答
93
投票

方法重载在编译时解决。

多重调度在运行时解决。

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

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 中的情况可能略有不同,但总体区别应该与此处在所有编程语言中介绍的相同。

© www.soinside.com 2019 - 2024. All rights reserved.