Author: Christian.Queinnec@lip6.fr

## Introduction

Comme son nom le laisse supposer, le langage Objective CAML possède la notion d'objet. À la différence de la programmation impérative qui est dirigée par les traitements ou de la programmation fonctionnelle qui est dirigée par les calculs, la programmation par objet est une programmation dirigée par les données. L'utilisation des objets introduit une nouvelle structuration des programmes en classes, les objets étant des instances de celles-ci. Une classe regroupe des données et des traitements. Ces derniers, appelés méthodes, définissent les comportements de l'objet. Le déclenchement d'un comportement est effectué par une requête sur l'objet appelée un envoi de message. L'objet qui reçoit ce message effectue l'action ou le calcul correspondant à la méthode invoquée dans le message : ce n'est pas une fonction qui est appliquée à des arguments, mais un message (correspondant à un nom de méthode) qui est envoyé à un objet. C'est à l'objet lui-même qu'il revient de déterminer quel est le code effectif à exécuter. Cette liaison retardée entre nom et code permet de faciliter la << modifiabilité >> des comportements; c'est-à-dire d'accroître la réutilisabilité du code.
La programmation par objets permet de spécifier les relations entre classes ainsi que la communication entre objets à travers les paramètres passés aux objets dans les messages. Elle offre une nouvelle modélisation des applications par les relations d'agrégation et d'héritage entre classes. Une classe qui hérite d'une autre classe possède toutes les définitions de la classe ancêtre, elle peut étendre les données et les méthodes, et même redéfinir des comportements hérités en respectant le typage. On utilisera une notation graphique1 pour représenter les relations entre classes.
L'extension objet d'Objective CAML s'intègre dans le système de types du langage. Une déclaration d'une classe définit un type du nom de la classe. La construction d'une instance de cette classe retourne une valeur du type de la classe. Deux genres de polymorphisme coexistent. Le premier est le polymorphisme paramétrique, déjà rencontré avec les types paramétrés, représenté par les classes paramétrées. Le deuxième, appelé polymorphisme d'inclusion, utilise la relation de sous-typage entre objets et la liaison retardée. Si le type de la classe sc est sous-type du type de la classe c, tout objet de sc peut être utilisé à la place d'un objet de c. Il faudra cependant que la contrainte entre sous-type et type soit explicite. Le polymorphisme d'inclusion permet de construire des listes hétérogènes où chaque élément est sous-type du type des éléments de la liste. Comme la liaison est retardée, l'envoi du même message à tous les éléments d'une telle liste peut activer des méthodes différentes, propres aux sous-classes.
Par contre Objective CAML n'intègre pas la notion de surcharge des méthodes qui autoriserait différentes définitions d'une même méthode. Cette limitation est induite par l'inférence de types qui tomberait sur des ambiguïtés et demanderait au programmeur d'avoir à fournir de trop nombreuses informations de type supplémentaires.
Il est à noter qu'Objective CAML est le seul langage muni d'une extension objet avec polymorphisme paramétrique et d'inclusion qui reste complètement typé statiquement avec une inférence de types.