[
Home
]
[ Index:
by date
|
by threads
]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
| Date: | -- (:) |
| From: | Tiphaine.Turpin <Tiphaine.Turpin@f...> |
| Subject: | Re: [Caml-list] Re: OO programming |
Tiphaine.Turpin a écrit : > > > ------------------------------------------------------------------------ > > Sujet: > Re: [Caml-list] Re: OO programming > Expéditeur: > "Tiphaine.Turpin" <Tiphaine.Turpin@free.fr> > Date: > Thu, 21 Feb 2008 17:55:49 +0100 > Destinataire: > Remi Vanicat <vanicat@debian.org> > > Destinataire: > Remi Vanicat <vanicat@debian.org> > > > Remi Vanicat a écrit : >> something like that might work (from the Dider Remy example) >> >> >> class ['observer] subject = >> object (self : 'mytype) >> val mutable observers : 'observer list = [] >> method add obs = observers <- obs :: observers >> method notify (message : 'observer -> 'mytype -> unit) = >> List.iter (fun obs -> message obs self) observers >> end;; >> >> class ['subject] observer = >> object >> constraint 'subject = 'a #subject >> end;; >> >> Note that it doesn't solve completely the problem (as #subject is >> still an open type) but it might catch some problem. >> >> > Thanks for your answer. It seems to be an interesting direction. Here > is a try to expand the example further, where I assume that messages > will go through one single method : > > class ['observer] subject = > object (self : 'mytype) > val mutable observers : 'observer list = [] > method add obs = observers <- obs :: observers > method notify (message : 'message) = > List.iter (fun obs -> obs#send message self) observers > end > > class virtual ['subject, 'message] observer = > object (self : 'self) > constraint 'subject = 'observer #subject > method virtual send : 'message -> 'subject -> unit > end > > This is still not enough, as I can for example, forget the 'subject > argument in the type of send, without any type error (at this point). > However, adding the constraint > > constraint 'observer = (_, _) #observer > > in the observer class does the work: if I write > > method virtual send : 'message -> 'subject -> unit > > then the class is rejected (with a horrible message, though, which I > don't reproduce here to avoid hurting the sensibility of inocent ocaml > users). the two classes seem to be "usable". Still, there is no link > between the type 'self in the observer, and the type of the observer > as viewed by the subject. I don't have a precise example in mind, but > I feel that something is missing. Of course something is missing : if I just forget the method send, then I have no error, which is problematic. > > > A stronger possibility (which doesn't work) is to add the following > constraint instead : > > constraint 'observer = 'self > > The class is rejected (when doing the same mistake as above: forgetting the 'subject argument, otherwise it typechecks normally) > and I even get an understandable message: > > method virtual send : 'message -> unit > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ > The method send has type 'a -> unit but is expected to have type > 'a -> < send : 'b; .. > #subject -> unit as 'b > In addition, if I now forget the virtual method send, it gets added automagically in the type ! > However, this constraint seems to be too restrictive, since, as I > understand, it forces the subject to know the exact type of the > observers which prevents (at least in my first tries) to add to a same > subject different sub-classes of observer (or maybe I'm not using the > right coercion). > > let s = new subject > let o = object inherit [_, _] observer method send _ _ = () method foo > = () end > let _ = s#add (o :> (_, _) observer) > > => long complicated message > I have the impression that the right constraint would be something like " 'self must be coercible to 'observer " but I don't know if this makes sense... > > Tiphaine Turpin > > > ------------------------------------------------------------------------ > > _______________________________________________ > Caml-list mailing list. Subscription management: > http://yquem.inria.fr/cgi-bin/mailman/listinfo/caml-list > Archives: http://caml.inria.fr > Beginner's list: http://groups.yahoo.com/group/ocaml_beginners > Bug reports: http://caml.inria.fr/bin/caml-bugs >