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 = 4ou 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 = 5mais 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: