next up previous
Next: Les types ouverts: des Up: Types et objets en Previous: Typage structurel

  
Les types objets ouverts et fermés

Considérons la fonction suivante en Ocaml

# let f(p) = p#getx + 1;;
val f : < getx : int; .. > -> int = <fun>
Le type de f est un type dit ouvert. Il indique que f peut prendre en argument n'importe quel objet qui possède au moins une méthode getx de type int avec éventuellement des méthodes en plus. La possibilité d'avoir d'autres méthodes est exprimée par les points de suspension ``...''. Par exemple, on peut appliquer f à:
# let p = new point 3;;
val p : point = <obj>
# f p;;
- : int = 4
ou aux objets instance de la classe exemple:
# class exemple =
 object
   method getx = 4
   method autre = "ab"
 end;;
class exemple = method getx : int method autre : string end

# let e = new exemple;;
val e : exemple = <obj>
# f e;;
- : int = 5
mais on ne peut pas appliquer f aux objets instance de la classe:
class un =
 object 
  method un = 1
end;;
class un  = method un : int end

let a = new un in f(a);;
                       ^
This expression has type un = < un : int > but is here used with type
  < getx : int; .. >

Un type d'objet qui ne contient pas des points de suspension est dit fermé. Là où un objet de type fermé est attendu, on ne peut donner qu'un objet qui possède exactement la même interface. Un type fermé est un type monomorphe, alors qu'un type ouvert est polymorphe.

Les notations point et #point permettent de parler respectivement des versions fermée et ouverte des objets de la classe point, à savoir4:

${\tt point} = < {\tt getx : int}; {\tt move: int} \rightarrow{\tt unit} >$
$ {\tt\char93 point} = < {\tt getx : int}; {\tt move: int} \rightarrow{\tt unit} ; \ldots >$



 
next up previous
Next: Les types ouverts: des Up: Types et objets en Previous: Typage structurel
Maria-Viginia Aponte
2001-04-10