Реализации алгоритмов/Мультиметод: различия между версиями

дополнение
(перенесено из 2 разных версий w:Мультиметод)
 
(дополнение)
{{wikipedia:|Мультиметод}}
'''Мультиме́тод''' ({{lang-en|multimethod}}) или '''мно́жественная диспетчериза́ция''' ({{lang-en|multiple dispatch}}) — механизм, позволяющий выбрать одну из нескольких функций в зависимости от динамических типов или значений аргументов.
 
В языке с поддержкой мультиметодов, таком, как [[w:Common Lisp]], код выглядел бы вот так:
 
<source lang="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))
;;космический корабль сталкивается с космическим кораблем
)
</source>
 
== C# ==
Реализация на [[w:C Sharp|C#]] 4.0, с использованием dynamic-типов:
<source lang="csharp">
class Program
{
class Thing { }
class Asteroid : Thing { }
class Spaceship : Thing { }
 
static void CollideWithImpl(Asteroid x, Asteroid y)
{
// астероид сталкивается с астероидом
}
 
static void CollideWithImpl(Asteroid x, Spaceship y)
{
// астероид сталкивается с космическим кораблем
}
 
static void CollideWithImpl(Spaceship x, Asteroid y)
{
// космический корабль сталкивается с астероидом
}
 
static void CollideWithImpl(Spaceship x, Spaceship y)
{
// космический корабль сталкивается с космическим кораблем
}
 
static void CollideWith(Thing x, Thing y)
{
dynamic a = x;
dynamic b = y;
CollideWithImpl(a, b);
}
 
static void Main(string[] args)
{
var asteroid = new Asteroid();
var spaceship = new Spaceship();
CollideWith(asteroid, spaceship);
CollideWith(spaceship, spaceship);
}
}
</source>
В данном случае, естественно, следует отличать мультиметоды от [[перегрузка функций|статической перегрузки]], так как, в отличие от последней, диспетчеризация происходит в [[Runtime|рантайме]].
 
В [[w:Объектно-ориентированное программирование|объектно-ориентированных]] языках, не поддерживающих синтаксис мультиметодов, множественную диспетчеризацию можно реализовать посредством виртуальных методов.