next up previous
Next: Sous-typage entre objets Up: Typage des objets en Previous: Types récursifs

Sous-typage

L'usage du sous-typage en Ocaml doit être signalé de manière explicite (contrairement au polymorphisme paramétrique qui est implicite). Par exemple si dans la fonction origin, on veut accepter en argument n'importe quel objet sous-type des points, on utilise la notation:

# let origin p = (p:>point)#getx = 0;;
val origin : < getx : int; move : int -> unit; .. > -> bool = <fun>

# let cp = new colorpoint 3 "rouge";;

# origin (cp);;
- : false = bool
La notation (p:>point) dit au compilateur de vérifier que le type de l'argument effectif donné pour p est un sous-type de point, puis de ne voir cet objet qu'à travers l'interface des points.

On dit que p:>point est une coercion. La coercion entraîne une perte d'information: on ne verra de l'argument effectif que les méthodes de point. Par exemple, la fonction suivante convertit tout objet sous-type de point en un point, en oubliant les méthodes en plus:

# let vers_point p = (p:>point);;
val vers_point : < getx : int; move : int -> unit; .. > -> point = <fun>

# let o = vers_point (cp);;
val o : point = <obj>

# o#getcolor;;
This expression has no method getcolor
Cette perte d'information peut paraître facheuse. En réalité elle très utile lorsque l'on veut mélanger plusieurs objets qui ont des types différents. Ainsi, grâce à la coercion on pourra écrire:
# [o;(cp:>point)];;
- : point list = [<obj>; <obj>]
alors que la liste suivante est incorrecte:
# [o;cp];;
This expression has type colorpoint list but is here used with type
  point list



 

Maria-Viginia Aponte
2001-04-10