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