Мультиметод

Материал из Википедии — свободной энциклопедии
Перейти к: навигация, поиск

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

В явном виде мультиметоды поддерживаются «объектной системой Common Lisp’а» (CLOS).

[править] Пример

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

В языке с поддержкой мультиметодов, таком, как 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))
  ;;космический корабль сталкивается с космическим кораблем
  )

Возможный аналог кода на C#, если бы тот поддерживал мультиметоды:

void Collide(Asteroid x, Asteroid y)
{
    //астероид сталкивается с астероидом
}
 
void Collide(Asteroid x, Spaceship y)
{
    //астероид сталкивается с космическим кораблем
}
 
void Collide(Spaceship x, Asteroid y)
{
    //космический корабль сталкивается с астероидом
}
 
void Collide(Spaceship x, Spaceship y)
{
    //космический корабль сталкивается с космическим кораблем
}

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

Личные инструменты
Пространства имён

Варианты
Действия
Навигация
Участие
Печать/экспорт
Инструменты
На других языках