Скажем, у нас есть типы A, B, C, D и E, а также методы m1, m2, m3, принимающие один аргумент предыдущих типов. Вы можете поместить их в таблицу следующим образом:
| A | B | C | D | E |
m1 | | | | | |
m2 | | | | | |
m3 | | | | | |
Стратегия оператора «переключатель» реализует одну строку этой таблицы за раз. Предположим, вы добавляете новый тип F. Вам придется модифицировать все реализации для его поддержки.
Полиморфизм на основе классов (C++, Java и т. д.) позволяет вместо этого реализовать целый столбец. Таким образом, добавление нового типа очень просто, так как вам не нужно изменять уже определенные классы. Но добавить новый метод сложно, так как вам придется добавить его ко всем другим типам.
Мультиметоды позволяют реализовать отдельные ячейки таблицы независимо друг от друга.
Эта гибкость еще больше, если вам нужно отправить несколько аргументов. Каждый новый аргумент добавляет еще одно измерение в эту таблицу, и диспетчеризация как на основе swich, так и на основе класса довольно быстро становится очень сложной (например, шаблон посетителя).
Обратите внимание, что мультиметоды на самом деле даже более универсальны, чем показано, поскольку вы можете выполнять диспетчеризацию почти по любому поводу, а не только по типам аргументов.
person
ivant
schedule
11.03.2012