Мультиме́тод (англ. 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)) ;;космічний корабель зіштовхується з космічним кораблем )
namespace MultipleDispatch { enum Outcome { Win, Lose, Draw, } abstract class Item { public abstract Outcome Compete(Item item); public abstract Outcome Evaluate(Paper paper); public abstract Outcome Evaluate(Scissors scissors); public abstract Outcome Evaluate(Rock rock); } class Paper : Item { public override Outcome Compete(Item item) => item.Evaluate(this); public override Outcome Evaluate(Paper paper) => Outcome.Draw; public override Outcome Evaluate(Scissors scissors) => Outcome.Win; public override Outcome Evaluate(Rock rock) => Outcome.Lose; } class Scissors : Item { public override Outcome Compete(Item item) => item.Evaluate(this); public override Outcome Evaluate(Paper paper) => Outcome.Lose; public override Outcome Evaluate(Scissors scissors) => Outcome.Draw; public override Outcome Evaluate(Rock rock) => Outcome.Win; } class Rock : Item { public override Outcome Compete(Item item) => item.Evaluate(this); public override Outcome Evaluate(Paper paper) => Outcome.Win; public override Outcome Evaluate(Scissors scissors) => Outcome.Lose; public override Outcome Evaluate(Rock rock) => Outcome.Draw; } class Program { static Item GetRandomItem() { switch (new System.Random().Next(3)) { case 0: return new Paper(); case 1: return new Scissors(); case 2: return new Rock(); default: throw new System.InvalidOperationException("Wrong item type"); } } static void Main(string[] args) { Item item1 = GetRandomItem(); Item item2 = GetRandomItem(); System.Console.WriteLine($"{item1.GetType().Name} - {item1.Compete(item2)} - {item2.GetType().Name}"); } } }
namespace MultipleDispatchPattern { enum Outcome { Win, Lose, Draw, } abstract class Item { public Outcome Compete(Item item) => Evaluate(this as dynamic, item as dynamic); private static Outcome Evaluate(Paper paper1, Paper paper2) => Outcome.Draw; private static Outcome Evaluate(Paper paper, Scissors scissors) => Outcome.Lose; private static Outcome Evaluate(Paper paper, Rock rock) => Outcome.Win; private static Outcome Evaluate(Scissors scissors, Paper paper) => Outcome.Win; private static Outcome Evaluate(Scissors scissors1, Scissors scissors2) => Outcome.Draw; private static Outcome Evaluate(Scissors scissors, Rock rock) => Outcome.Lose; private static Outcome Evaluate(Rock rock, Paper paper) => Outcome.Lose; private static Outcome Evaluate(Rock rock, Scissors scissors) => Outcome.Win; private static Outcome Evaluate(Rock rock1, Rock rock2) => Outcome.Draw; } class Paper : Item { } class Scissors : Item { } class Rock : Item { } class Program { static Item GetRandomItem() { switch (new System.Random().Next(3)) { case 0: return new Paper(); case 1: return new Scissors(); case 2: return new Rock(); default: throw new System.InvalidOperationException("Wrong item type"); } } static void Main(string[] args) { Item item1 = GetRandomItem(); Item item2 = GetRandomItem(); System.Console.WriteLine($"{item1.GetType().Name} - {item1.Compete(item2)} - {item2.GetType().Name}"); } } }
Посилання
- Bjarne Stroustrup; Yuriy Solodkyy; Peter Pirkelbauer (2007). (PDF). ACM 6th International Conference on Generative Programming and Component Engineering. Архів оригіналу (PDF) за 29 квітня 2021. Процитовано 2 серпня 2015.
В іншому мовному розділі є повніша стаття Multiple dispatch(англ.). Ви можете допомогти, розширивши поточну статтю за допомогою з англійської.
|
Це незавершена стаття про мови програмування. Ви можете проєкту, виправивши або дописавши її. |
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Multime tod angl multimethod abo mnozhi nna dispetcheriza ciya angl multiple dispatch mehanizm yakij dozvolyaye vibrati odnu z dekilkoh funkcij v zalezhnosti vid dinamichnih tipiv abo znachen argumentiv Ye rozshirennyam odinochnoyi dispetcherizaciyi virtualnih funkcij de vibir metodu zdijsnyuyetsya dinamichno na osnovi faktichnogo tipu ob yekta Mnozhinna dispetcherizaciya uzagalnyuye dinamichnu dispetcherizaciyu dlya vipadkiv z dvoma abo bilshoyu kilkistyu ob yektiv V yavnomu viglyadi multimetodi pidtrimuyutsya ob yektnoyu sistemoyu tipiv Common Lisp a CLOS PrikladDlya krashogo rozuminnya riznici mizh multimetodami i odinochnoyu dispetcherizaciyeyu mozhna prodemonstruvati nastupnij priklad Uyavimo sobi gru v yakij poryad z riznomanitnimi inshimi ob yektami prisutni asteroyidi ta kosmichni korabli Koli dva yakih nebud ob yekti zishtovhuyutsya programa povinna vibrati pevnij algoritm dij v zalezhnosti vid togo sho iz chim zishtovhnulos V movi z pidtrimkoyu multimetodiv takij yak Common Lisp kod viglyadav bi tak defgeneric collide x y defmethod collide x asteroid y asteroid asteroyid zishtovhuyetsya z asteroyidom defmethod collide x asteroid y spaceship asteroyid zishtovhuyetsya z kosmichnim korablem defmethod collide x spaceship y asteroid kosmichnij korabel zishtovhuyetsya z asteroyidom defmethod collide x spaceship y spaceship kosmichnij korabel zishtovhuyetsya z kosmichnim korablem Priklad realizaciyi na movi S namespace MultipleDispatch enum Outcome Win Lose Draw abstract class Item public abstract Outcome Compete Item item public abstract Outcome Evaluate Paper paper public abstract Outcome Evaluate Scissors scissors public abstract Outcome Evaluate Rock rock class Paper Item public override Outcome Compete Item item gt item Evaluate this public override Outcome Evaluate Paper paper gt Outcome Draw public override Outcome Evaluate Scissors scissors gt Outcome Win public override Outcome Evaluate Rock rock gt Outcome Lose class Scissors Item public override Outcome Compete Item item gt item Evaluate this public override Outcome Evaluate Paper paper gt Outcome Lose public override Outcome Evaluate Scissors scissors gt Outcome Draw public override Outcome Evaluate Rock rock gt Outcome Win class Rock Item public override Outcome Compete Item item gt item Evaluate this public override Outcome Evaluate Paper paper gt Outcome Win public override Outcome Evaluate Scissors scissors gt Outcome Lose public override Outcome Evaluate Rock rock gt Outcome Draw class Program static Item GetRandomItem switch new System Random Next 3 case 0 return new Paper case 1 return new Scissors case 2 return new Rock default throw new System InvalidOperationException Wrong item type static void Main string args Item item1 GetRandomItem Item item2 GetRandomItem System Console WriteLine item1 GetType Name item1 Compete item2 item2 GetType Name Priklad realizaciyi na movi S iz vikoristannyam dynamic namespace MultipleDispatchPattern enum Outcome Win Lose Draw abstract class Item public Outcome Compete Item item gt Evaluate this as dynamic item as dynamic private static Outcome Evaluate Paper paper1 Paper paper2 gt Outcome Draw private static Outcome Evaluate Paper paper Scissors scissors gt Outcome Lose private static Outcome Evaluate Paper paper Rock rock gt Outcome Win private static Outcome Evaluate Scissors scissors Paper paper gt Outcome Win private static Outcome Evaluate Scissors scissors1 Scissors scissors2 gt Outcome Draw private static Outcome Evaluate Scissors scissors Rock rock gt Outcome Lose private static Outcome Evaluate Rock rock Paper paper gt Outcome Lose private static Outcome Evaluate Rock rock Scissors scissors gt Outcome Win private static Outcome Evaluate Rock rock1 Rock rock2 gt Outcome Draw class Paper Item class Scissors Item class Rock Item class Program static Item GetRandomItem switch new System Random Next 3 case 0 return new Paper case 1 return new Scissors case 2 return new Rock default throw new System InvalidOperationException Wrong item type static void Main string args Item item1 GetRandomItem Item item2 GetRandomItem System Console WriteLine item1 GetType Name item1 Compete item2 item2 GetType Name PosilannyaBjarne Stroustrup Yuriy Solodkyy Peter Pirkelbauer 2007 PDF ACM 6th International Conference on Generative Programming and Component Engineering Arhiv originalu PDF za 29 kvitnya 2021 Procitovano 2 serpnya 2015 V inshomu movnomu rozdili ye povnisha stattya Multiple dispatch angl Vi mozhete dopomogti rozshirivshi potochnu stattyu za dopomogoyu perekladu z anglijskoyi Divitis avtoperekladenu versiyu statti z movi anglijska Perekladach povinen rozumiti sho vidpovidalnist za kincevij vmist statti u Vikipediyi nese same avtor redaguvan Onlajn pereklad nadayetsya lishe yak korisnij instrument pereglyadu vmistu zrozumiloyu movoyu Ne vikoristovujte nevichitanij i nevidkorigovanij mashinnij pereklad u stattyah ukrayinskoyi Vikipediyi Mashinnij pereklad Google ye korisnoyu vidpravnoyu tochkoyu dlya perekladu ale perekladacham neobhidno vipravlyati pomilki ta pidtverdzhuvati tochnist perekladu a ne prosto skopiyuvati mashinnij pereklad do ukrayinskoyi Vikipediyi Ne perekladajte tekst yakij vidayetsya nedostovirnim abo neyakisnim Yaksho mozhlivo perevirte tekst za posilannyami podanimi v inshomovnij statti Dokladni rekomendaciyi div Vikipediya Pereklad Ce nezavershena stattya pro movi programuvannya Vi mozhete dopomogti proyektu vipravivshi abo dopisavshi yiyi