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,
et il est facile de voir que la variable de type
peut-être instanciée par la suite des méthodes
.
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 intle 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.