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

м
<source> -> <syntaxhighlight> (phab:T237267)
(→‎Python: дополнение более простого синтаксиса)
м (<source> -> <syntaxhighlight> (phab:T237267))
 
В языке с поддержкой мультиметодов, таком, как [[w:Common Lisp|Common Lisp]], код выглядел бы вот так:
 
<sourcesyntaxhighlight lang="Lisp">
(defgeneric collide (x y))
 
;;космический корабль сталкивается с космическим кораблем
)
</syntaxhighlight>
</source>
 
== C# ==
Реализация на [[w:C Sharp|C#]] 4.0, с использованием dynamic-типов:
<sourcesyntaxhighlight lang="csharp">
class Program
{
}
}
</syntaxhighlight>
</source>
В данном случае, естественно, следует отличать мультиметоды от [[w:перегрузка функций|статической перегрузки]], так как, в отличие от последней, диспетчеризация происходит в [[w:Runtime|рантайме]].
 
 
== Пример двойной диспетчеризации на языке Java ==
<sourcesyntaxhighlight lang="java">
public abstract class Thing {
public abstract void collide(Thing thing);
}
}
</syntaxhighlight>
</source>
 
== C++ ==
 
<sourcesyntaxhighlight lang=cpp>/* Пример, использующий сравнение типов во время выполнения */
void Asteroid::collide_with(Thing * other) {
Asteroid * other_asteroid = dynamic_cast<Asteroid*>(other);
return;
}
}</sourcesyntaxhighlight>
или:
<sourcesyntaxhighlight lang=cpp>/* Пример, использующий полиморфизм и перегрузку методов */
void Asteroid::collide_with(Thing * other) {
other->collide_with(this);
void Spaceship::collide_with(Asteroid * other) {
// deal with spaceship hitting asteroid
}</sourcesyntaxhighlight>
 
== Python ==
 
С помощью модуля [http://gnosis.cx/download/gnosis/magic/multimethods.py multimethods.py] (из Gnosis Utils):
<sourcesyntaxhighlight lang="python">
from multimethods import Dispatch
 
collision2 = collide(s1, s2)[0]
 
</syntaxhighlight>
</source>
 
С помощью модуля multipledispatch (https://pypi.python.org/pypi/multipledispatch/) получается намного более простой синтаксис:
<sourcesyntaxhighlight lang="python">
 
from multipledispatch import dispatch
collision1 = collide(a, s1)
collision2 = collide(s1, s2)
</syntaxhighlight>
</source>
 
== Ruby ==
 
С помощью модуля [http://rubyforge.org/projects/vlx-multi/ Vlx-multi]:
<sourcesyntaxhighlight lang="ruby">
 
require 'vlx_multi'
collide(s,a)
collide(a,a)
</syntaxhighlight>
</source>
 
{{BookCat}}
583

правки