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