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 unboundLe 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.