В чем разница между многократной отправкой и перегрузкой метода? - PullRequest
34 голосов
/ 26 ноября 2009

В таких языках, как Scala, можно иметь несколько определений для одного имени метода путем изменения количества параметров и / или типа параметров метода. Это называется перегрузкой метода.

Чем это отличается от многократной отправки?

Спасибо

1 Ответ

55 голосов
/ 26 ноября 2009

Перегрузка метода разрешается во время компиляции.

Многократная отправка разрешается во время выполнения.

При использовании двойной диспетчеризации вызываемый метод зависит от фактического типа получателя и аргументов. Однако перегрузка метода позволяет только вызываемому методу зависеть от объявленного типа параметров. Зачем? 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 все может немного отличаться, хотя общее различие должно быть таким, как представлено здесь на всех языках программирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...