From mboxrd@z Thu Jan 1 00:00:00 1970 Received: (from weis@localhost) by pauillac.inria.fr (8.7.6/8.7.3) id OAA09897 for caml-redistribution; Thu, 5 Jun 1997 14:08:12 +0200 (MET DST) Received: from concorde.inria.fr (concorde.inria.fr [192.93.2.39]) by pauillac.inria.fr (8.7.6/8.7.3) with ESMTP id MAA07998 for ; Thu, 5 Jun 1997 12:09:15 +0200 (MET DST) Received: from madiran.inria.fr (madiran.inria.fr [128.93.8.77]) by concorde.inria.fr (8.8.5/8.7.3) with ESMTP id MAA24413; Thu, 5 Jun 1997 12:09:08 +0200 (MET DST) Received: from madiran.inria.fr (localhost.inria.fr [127.0.0.1]) by madiran.inria.fr (8.7.4/8.6.6) with ESMTP id MAA30520; Thu, 5 Jun 1997 12:09:00 +0200 Message-Id: <199706051009.MAA30520@madiran.inria.fr> X-Mailer: exmh version 1.6.4 10/10/95 From: Francois Rouaix To: Vyskocil Vladimir cc: Caml list Subject: Re: Ocaml et les objets In-reply-to: Your message of "Tue, 03 Jun 1997 16:09:36 +0200." <339425A0.7A65285D@math.unice.fr> Reply-To: Francois.Rouaix@inria.fr Mime-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: quoted-printable Date: Thu, 05 Jun 1997 12:08:59 +0200 Sender: weis > Par exemple si l'on veut creer une liste qui > contienne des objets derives d'un type parent il faut les "caster" > en ce type parent mais ensuite comment les recuperer en tant qu'objets > derives ? Une fois qu'on a "oublié" le vrai type d'un objet, on ne peut plus y revenir, parce que le typage est statique. Redescendre dans la hiérarchie des types imposerait une vérification de type à run-time. Par contre, l'objet lui-même garde son type, et si cet objet a été lié avec son vrai type dans l'environnement, on y a toujours accès. De plus, il ne faut pas oublier que le polymorphisme s'applique aussi aux interfaces. > J'ai essaye le package Obj avec notamment la fonction > Obj.magic mais ca me parait un peu risque En effet. Le système de types est là pour garantir que le programmeur fait les choses proprement. Utiliser Obj.magic est une mauvaise idée. > et je n'arrive pas a faire une > fonction qui puisse renvoyer un objet derive quelconque car justement il > n'ont pas des types compatibles, Une fonction ne peut pas renvoyer des valeurs de type "variable", sauf lorsqu'elle est polymorphe et qu'elle connait le vrai type en entree. A mon avis, si on doit avec plusieurs objets de types differents (A, B, C) mais dont l'interface a un sous-ensemble commun I, on peut tres bien les mettre dans une liste et ensuite faire des traitements ou transformations sur cette liste pourvu que ces traitements soient en realite dans des methodes des classes A, B et C. On peut meme avoir des methodes qui "copient" des objets, comme dans l'exemple (incomplet) suivant: let o1 = new A and o2 = new B and o3 = new C let l = [(o1 :> I); (o2 :> I); (o3 :> I)] let f l = List.map (fun o -> o#m)) l let l' = f l Ci-joint une version de ton exemple: class virtual object (class_name : string) : 'a = val name = class_name method get_name = name virtual m : 'a and closed o_int (new_i : int) = inherit object "o_int" = val i = new_i = method get_value = i method m = new o_int (i+1) and closed o_float (new_f : float) = inherit object "o_float" val f = new_f = method get_value = f method m = new o_float (f+.1.0) end let o1=new o_int 1;; let o2=new o_float 2.5;; let l = [(o1 :> object); (o2 :> object)];; (* val l : object list *) let incremente l = List.map (fun o -> o#m) l;; (* val incremente : < m : 'a; .. > list -> 'a list *) let l' = incremente l;; (* val l' : object list *) --f