next up previous
Next: Classes paramétrées par un Up: Types et objets en Previous: Le polymorphisme des objets

Héritage et polymorphisme paramétrique

En Ocaml, l'héritage garantît la propriété suivante: le type d'une sous-classe est toujours une instance polymorphe du type de sa super-classe5. Par exemple, colorpoint est une instance polymorphe de #point. En effet,

\begin{displaymath}\begin{array}{lll}
{\tt\char93 point} & = & < {\tt getx : int...
...; {\tt setcolor: string} \rightarrow{\tt unit} >\\
\end{array}\end{displaymath}

et il est facile de voir que la variable de type $\rho$ peut-être instanciée par la suite des méthodes $ ( {\tt getcolor : string}; {\tt setcolor: string} \rightarrow{\tt unit})$.

Pour garantîr cette propriété, lors de la définition d'une sous-classe la contrainte suivante doit être respectée.

Contrainte de l'héritage:

les méthodes redéfinies dans une sous-classe ne peuvent avoir qu'un type égal ou instance polymorphe de celui de la méthode dans la super-classe.

class autre (x:int) =
 inherit point x
 method getx = true
end;;
This expression has type bool but is here used with type int
le type autre n'est pas une instance de #point, et de ce fait, le compilateur refuse la définition de cette classe.

Cette contrainte semble naturelle et même souhaitable. Intuitivement, une sous-classe a un type plus spécialisé que celui de la classe parente, et l'on s'attend, d'une part, à ce que les types des méthodes soient égaux ou plus spécialisés également, et d'autre part à ce qu'il soit impossible de redefinir le type d'une méthode héritée avec un type incompatible.

Par exemple, si la classe colorpoint redéfinit la méthode getx des points avec le type float, alors, le méthode print des points devient inutilisable par les points colorés, de même que la fonction origin.


next up previous
Next: Classes paramétrées par un Up: Types et objets en Previous: Le polymorphisme des objets
Maria-Viginia Aponte
2001-04-10