Fonction générique

0

En programmation informatique , une fonction générique est une fonction définie pour le polymorphisme .

Dans les langages à typage statique

Dans les langages typés statiquement (tels que C++ et Java ), le terme fonctions génériques fait référence à un mécanisme de polymorphisme au moment de la compilation ( répartition statique ), en particulier le polymorphisme paramétrique . Ce sont des fonctions définies avec TypeParameters , destinées à être résolues avec des informations de type au moment de la compilation . Le compilateur utilise ces types pour instancier les versions appropriées, résolvant toute surcharge de fonction de manière appropriée.

Dans le système d’objets Common Lisp

Dans certains systèmes de programmation orientée objet tels que le Common Lisp Object System (CLOS) [1] et Dylan , une fonction générique est une entité composée de toutes les méthodes ayant le même nom. Généralement, une fonction générique est une instance d’une classe qui hérite à la fois de function et de standard-object . Ainsi, les fonctions génériques sont à la fois des fonctions (qui peuvent être appelées avec et appliquées à des arguments) et des objets ordinaires. Le livre The Art of the Metaobject Protocol explique en détail l’implémentation et l’utilisation des fonctions génériques CLOS.

L’une des premières extensions de programmation orientée objet de Lisp est Flavors . Il a utilisé le paradigme habituel d’envoi de messages influencé par Smalltalk . La syntaxe Flavors pour envoyer un message est :

( envoyer objet : message )

Avec New Flavors, il a été décidé que le message devait être une fonction réelle et que la syntaxe d’appel de fonction habituelle devait être utilisée :

( objet message )

message est maintenant une fonction générique , un objet et une fonction à part entière. Les implémentations individuelles du message sont appelées méthodes .

La même idée a été implémentée dans CommonLoops . [2] Les nouvelles saveurs et les boucles communes ont été la principale influence du système d’objets Common Lisp.

Exemple

Lisp commun

Définissez une fonction générique avec deux paramètres objet-1 et objet-2. Le nom de la fonction générique est collide .

( collision défgénérique ( objet-1 objet-2 ))

Les méthodes appartenant à la fonction générique sont définies en dehors des classes. Nous définissons ici une méthode pour la fonction générique collision qui est spécialisée pour les classes astéroïde (premier paramètre objet-1) et vaisseau spatial (second paramètre objet-2). Les paramètres sont utilisés comme variables normales dans le corps de la méthode. Il n’y a pas d’espace de noms spécial ayant accès aux emplacements de classe.

( defmethod collision (( objet-1 astéroïde ) ( objet-2 vaisseau spatial )) ( format t “astéroïde ~a entre en collision avec le vaisseau spatial ~a” objet-1 objet-2 ))

Appel de la fonction générique :

? ( collision ( make-instance ‘asteroid ) ( make-instance ‘spaceship )) l’ astéroïde # <ASTEROID 4020003FD3> entre en collision avec le vaisseau spatial # <SPACESHIP 40200048CB>

Common Lisp peut également récupérer des méthodes individuelles à partir de la fonction générique. FIND-METHOD trouve la méthode à partir de la fonction générique collision spécialisée pour les classes astéroïde et vaisseau spatial .

? ( find-method #’ collision nil ( list ( find-class ‘asteroid ) ( find-class ‘spaceship ))) # <STANDARD-METHOD COLLIDE NIL ( ASTEROID SPACESHIP ) 4150015E43>

Comparaison avec d’autres langues

Les fonctions génériques correspondent à peu près à ce que Smalltalk appelle les méthodes , à l’exception notable que, dans Smalltalk, la classe du récepteur est le seul déterminant du corps de code appelé : les types ou les valeurs des arguments ne sont pas pertinents ( single dispatch ). Dans un langage de programmation avec répartition multiple , lorsqu’une fonction générique est appelée, la répartition de la méthode se produit sur la base de tous les arguments, et non d’un seul qui est privilégié. New Flavours a également fourni des fonctions génériques, mais une seule répartition.

Références

  1. ^ Le système d’objets Common Lisp: un aperçu
  2. ^ “CommonLoops, fusion de Lisp et programmation orientée objet” (PDF) . Archivé de l’original (PDF) le 2011-06-04 . Récupéré le 10/12/2009 .
You might also like
Leave A Reply

Your email address will not be published.

This website uses cookies to improve your experience. We'll assume you're ok with this, but you can opt-out if you wish. Accept Read More