La règle de sous-typage entre
deux classes impose le sous-typage entre les types de
leurs méthodes. Intuitivement, les relations être sous-classe
et être sous-type semblent très proches. Dans les deux cas,
on pense à une spécialisation et/ou enrichissement des types,
des méthodes et/ou de leurs codes par rapport aux informations contenues
dans la super-classe ou le super-type. On pourrait alors
penser qu'une
sous-classe est toujours un sous-type de sa super-classe, autrement dit,
que être une sous-classe de est équivalent à
être un sous-type de pour les mêmes classes.
En simplifiant, nous parlons d'égalité Sous-classe = Sous-type.
Cette égalité n'est pas vrai de manière général. La première
raison tient à ce qu'on peut être en relation de sous-typage
sans être en relation de sous-classe. Par exemple, pour les versions
données précédemment des classes point et colorpoint,
on peut écrire une troisième classe autre,
qui a la même interface que colorpoint mais
qui n'hérite pas de point. La classe autre est bien
un sous-type de point sans en être une sous-classe. Donc,
un sous-type n'est pas toujours une sous-classe.
La deuxième raison, concerne le sens inverse de l'égalité: une sous-classe n'est pas toujours un sous-type. Nous donnons deux exemples. Le premier est en dehors d'Ocaml: il est écrit dans un langage immaginaire où le typage des objets se fait exclusivement par sous-typage. Le deuxième correspond à un vrai programme Ocaml dont l'éxécution échoue si l'on forcait cette égalité à être vraie.