Скажем, у нас есть типы A, B, C, D и E и методы m1, m2, m3, принимающие один аргумент предыдущих типов. Вы можете разместить их в таблице следующим образом:
| A | B | C | D | E |
m1 | | | | | |
m2 | | | | | |
m3 | | | | | |
Стратегия операторов «switch» реализует одну строку этой таблицы одновременно Предположим, вы добавили новый тип F. Вам нужно будет изменить все реализации для его поддержки.
Полиморфизм на основе классов (C++, Java и т. Д.) Позволяет вместо этого реализовать целый столбец. Таким образом, добавление нового типа легко, поскольку вам не нужно менять уже определенные классы. Но добавить новый метод сложно, так как вам придется добавить его ко всем другим типам.
Мультиметоды позволяют реализовать отдельные ячейки таблицы независимо друг от друга.
Эта гибкость еще больше, если вам нужно отправить несколько аргументов. Каждый новый аргумент добавляет другое измерение в эту таблицу, и как на основе swich, так и на основе класса отправления становятся очень сложными довольно быстро (c.f. Visitor pattern).
Обратите внимание, что мультиметоды на самом деле даже более общие, чем изображенные, так как вы можете отправлять практически все, а не только по типам аргументов.
Где линия, заключенная между выражением if и overglorated goto? – Kevin
Возможно, вам будет интересно http://stackoverflow.com/q/5986120/625403, который не является точно дублирующим, но тесно связан. – amalloy