Introduction
Comme son nom le laissait supposé, le langage Objective CAML possède une
extension 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 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 appliqée à des arguments, mais un message (correspondant à un
nom de méthode) qui est envoyé à un objet. C'est à l'objet
lui-même que 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 objet permet de spécifier les relations entre classes
ainsi que la communication entre objets à travers les paramètres
passés aux 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 donc étendre les données et
les méthodes, et même redéfinir des comportements hérités. On utilise
une notation graphique1
pour représenter les relations entre classes.
L'extension objet d'Objective CAML s'intègre dans le système de type 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 la classe sc est sous-type de la classe c, tout objet de
sc peut être utilisé à la place d'un objet de c.
Il faudra cependant que la coercion 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 autorise plusieurs définitions, différant par le nombre et le type de ses paramètres, d'une même méthode. Cette limitation est induite par l'inférence de types
qui tomberait sur trop de cas d'ambiguïté 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.