Dispatch multiple

Le dispatch multiple est une fonctionnalité de certains langages orientés objet ou fonctionnels dans lesquels une fonction ou une méthode peut être spécialisée pour plus d'un de ses paramètres formels. On l'appelle alors multiméthode.

La spécialisation d'une multiméthode peut ainsi dépendre du type dynamique de plusieurs de ses paramètres objets, à la différence des langages de programmation orientés objet classiques, dans lesquels la spécialisation ne dépend que du premier paramètre implicite this.

Elle se distingue de la surcharge de fonction présente dans de nombreux langages de programmation, dans lesquels le choix de la fonction à utiliser dépend du type statique de ses paramètres, ce qui correspond à un dispatch multiple effectué au moment de la compilation.

Le premier environnement orienté objet à avoir eu cette fonctionnalité, et le plus connu, est le Common Lisp Object System, mais d'autres langages comme Dylan, Slate, Cecil, GNU Guile, Seed7, Julia et le descendant de Java Nice offrent des fonctionnalités similaires. En C++ il est possible d'implémenter des multiméthodes comme foncteurs et templates de plusieurs façons.

Exemples

Dans les langages comme Java qui ne peuvent avoir un dispatch que sur un seul argument, on utilise le patron de conception visiteur. En C++, l'utilisation conjointe du patron de conception visiteur et du mécanisme de template permet d'obtenir un dispatch sur plusieurs arguments[1].

Python quant à lui nécessite d'importer le module multimethods.py[2].

Soit la multiméthode collision-avec :

 (defmethod collision-avec ((x asteroide) (y asteroide))
   ;; cas où un astéroïde frappe un astéroïde
   )
 (defmethod collision-avec ((x asteroide) (y vaisseau))
   ;; cas où un astéroïde frappe un vaisseau spatial
   )
 (defmethod collision-avec ((x vaisseau) (y asteroide))
   ;; cas où un vaisseau spatial frappe un astéroïde
   )
 (defmethod collision-avec ((x vaisseau) (y vaisseau))
   ;; cas où un vaisseau spatial frappe un vaisseau spatial
   )

Notes et références

Voir aussi

Sur les autres projets Wikimedia :

Content Disclaimer

Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.

  1. The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
  2. There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
  3. It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
  4. Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
  5. Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.