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.