next up previous
Next: Sous-typage Up: Types et objets en Previous: Contraintes de typage

Types récursifs

Le type d'une classe est récursif si le nom du type apparaît dans la description du type. Par exemple, une classe dont l'une des méthodes renvoie self en résultat aura un type récursif:

# class duplicable =
 object(self)
   val x = 1
   method getx = x
   method clone = self
 end;;
class duplicable :
  object ('a) val x : int method clone : 'a method getx : int end

Dans ce type, la variable de type 'a est une abréviation pour le nom de la classe duplicable. On peut le réecrire (nous notons 'a = $\alpha$):

\begin{displaymath}\alpha = < {\tt getx: int}; {\tt clone} : \alpha >
\end{displaymath}

Ce type est récursif: le nom du type $\alpha$ que l'on définit apparaît dans le type de la méthode clone.

Une situation analogue se présente lorsqu'une méthode prend en paramètre un objet de même type que self. Par exemple, rajoutons aux points une méthode equal pour comparer les coordonées du point avec celles d'un autre point passé en paramètre:

class point init =
 object(self: 'a)
   val mutable x = init
   method getx = x
   method print = print_int x
   method equal (y:'a)  = y#getx = self#getx
 end;;
class point :
  int ->
  object ('a)
    val mutable x : int
    method equal : 'a -> bool
    method getx : int
    method print : unit
  end



Maria-Viginia Aponte
2001-04-10