next up previous
Next: Contraintes de typage Up: Types et objets en Previous: Héritage et polymorphisme paramétrique

Classes paramétrées par un type

En Ocaml, il est possible de paramétrer une classe par des variables de types, comme dans une déclaration de types classique (listes polymorphes, etc.). Cela permet d'écrire des classe polymorphes qui se mélangent harmonieusement aux autres contructions du langage tout en augmentant la reutilisabilité du code.

Par exemple, on peut définir la classe des points dont le type de la représentation interne est un paramètre 'a:

#class ['a] point (init : 'a) =
 object
   val mutable x = init
   method getx = x
   method setx d = x<-d
 end;;

Notons que, sans la représentation des points, il est impossible d'écrire la méthode d'affichage. L'interface donnée est:

class ['a] point :
  'a ->
  object 
   val mutable x : 'a 
   method getx : 'a method 
   setx : 'a -> unit end

Pour définir un point, nous devons maintenant donner une valeur d'initialisation qui servira, en particulier, à préciser le type interne des points. Pour p1, le paramètre de type est instancié à int; pour p2 il est instancié à float.

# let p1 = new point 1;;
val p1 : int point = <obj>

# let p2 = new point 3.5;;
val p2 : float point = <obj>
Bien, évidemment, nous ne pouvons pas mélanger des points avec des représentations internes différentes:

# if true then p1 else p2;;
This expression has type float point = < getx : float; setx : float -> unit >
but is here used with type int point = < getx : int; setx : int -> unit >

Les classes paramétrées sont incontournables du moment òu les arguments de la classe ou les types de méthodes sont polymorphes (ou plus préciseement, si leur type contient des variables de type autres que le type de self). Ainsi, il aurait été impossible d'écrire:

#class point (init : 'a) =
 object
   val mutable x = init
   method getx = x
   method setx d = x<-d
 end;;

Some type variables are unbound in this type:
  class point :
    'a ->
    object val mutable x : 'a method getx : 'a method setx : 'a -> unit end
The method getx has type 'a where 'a is unbound
Le compilateur nous signale qu'il est nécessaire de lier la variable 'a (c.a.d. la poser en paramètre) lors de la définition de la classe.


next up previous
Next: Contraintes de typage Up: Types et objets en Previous: Héritage et polymorphisme paramétrique
Maria-Viginia Aponte
2001-04-10