Мультиме́тод (англ. multimethod) або множи́нна диспетчериза́ція (англ. multiple dispatch) — механізм, який дозволяє вибрати одну з декількох функцій в залежності від динамічних типів або значень аргументів. Є розширенням одиночної диспетчеризації (віртуальних функцій), де вибір методу здійснюється динамічно на основі фактичного типу об'єкта. Множинна диспетчеризація узагальнює динамічну диспетчеризацію для випадків з двома або більшою кількістю об'єктів.

В явному вигляді мультиметоди підтримуються «об'єктною системою типів Common Lisp’а» (CLOS[en]).

ПрикладРедагувати

Для кращого розуміння різниці між мультиметодами і одиночною диспетчеризацією можна продемонструвати наступний приклад. Уявимо собі гру, в якій поряд з різноманітними іншими об'єктами, присутні астероїди та космічні кораблі. Коли два яких-небудь об'єкти зіштовхуються, програма повинна вибрати певний алгоритм дій, в залежності від того що із чим зіштовхнулось.

В мові з підтримкою мультиметодів, такій, як Common Lisp, код виглядав би так:

(defgeneric collide (x y))

(defmethod collide ((x asteroid) (y asteroid))
  ;;астероїд зіштовхується з астероїдом
  )

(defmethod collide ((x asteroid) (y spaceship))
  ;;астероїд зіштовхується з космічним кораблем
  )

(defmethod collide ((x spaceship) (y asteroid))
  ;;космічний корабель зіштовхується з астероїдом
  )

(defmethod collide ((x spaceship) (y spaceship))
  ;;космічний корабель зіштовхується з космічним кораблем
  )

ПосиланняРедагувати

  • Bjarne Stroustrup; Yuriy Solodkyy; Peter Pirkelbauer (2007). Open Multi-Methods for C++ ACM 6th International Conference on Generative Programming and Component Engineering.