* [Caml-list] Alternate constructors for a class @ 2003-09-02 13:45 Richard Jones 2003-09-02 15:11 ` Michal Moskal 2003-09-02 16:07 ` Gerd Stolpmann 0 siblings, 2 replies; 3+ messages in thread From: Richard Jones @ 2003-09-02 13:45 UTC (permalink / raw) To: caml-list I have a class defined currently like this: class view ?width ?height ?packing ?show ?(title = "untitled") () = (* ... *) I want to provide an alternate way of constructing this class, in this case by unmarshalling it from a channel (using the Marshall module). Callers should be able to construct a view either using the explicit parameters, or by doing: let chan = open_in_bin "serialized_class" in let view = new view ~chan in (* ... *) Now in the case above I guess I could add an extra optional ?chan argument, but that seems a bit ugly because it doesn't prevent users from supplying incorrectly both ~chan and ~title, for example. Is there an easy way to provide two different constructors for a class? Other languages do allow different sets of arguments to different constructors for the same class quite naturally. Rich. -- Richard Jones. http://www.annexia.org/ http://freshmeat.net/users/rwmj Merjis Ltd. http://www.merjis.com/ - all your business data are belong to you. "I wish more software used text based configuration files!" -- A Windows NT user, quoted on Slashdot. ------------------- To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/ Beginner's list: http://groups.yahoo.com/group/ocaml_beginners ^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [Caml-list] Alternate constructors for a class 2003-09-02 13:45 [Caml-list] Alternate constructors for a class Richard Jones @ 2003-09-02 15:11 ` Michal Moskal 2003-09-02 16:07 ` Gerd Stolpmann 1 sibling, 0 replies; 3+ messages in thread From: Michal Moskal @ 2003-09-02 15:11 UTC (permalink / raw) To: Richard Jones; +Cc: caml-list On Tue, Sep 02, 2003 at 02:45:37PM +0100, Richard Jones wrote: > Is there an easy way to provide two different constructors for a > class? Export function for constructing objects of this class. You can also only export class type, not the class itself, to allow object construction only through this function. Of course there can be any number of this kind of constructor-functions. -- : Michal Moskal :: http://www.kernel.pl/~malekith : GCS {C,UL}++++$ a? !tv : When in doubt, use brute force. -- Ken Thompson : {E-,w}-- {b++,e}>+++ h ------------------- To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/ Beginner's list: http://groups.yahoo.com/group/ocaml_beginners ^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [Caml-list] Alternate constructors for a class 2003-09-02 13:45 [Caml-list] Alternate constructors for a class Richard Jones 2003-09-02 15:11 ` Michal Moskal @ 2003-09-02 16:07 ` Gerd Stolpmann 1 sibling, 0 replies; 3+ messages in thread From: Gerd Stolpmann @ 2003-09-02 16:07 UTC (permalink / raw) To: Richard Jones; +Cc: caml-list Am Die, 2003-09-02 um 15.45 schrieb Richard Jones: > I have a class defined currently like this: > > class view ?width ?height ?packing ?show ?(title = "untitled") () = > (* ... *) > > I want to provide an alternate way of constructing this class, in this > case by unmarshalling it from a channel (using the Marshall module). > Callers should be able to construct a view either using the explicit > parameters, or by doing: > > let chan = open_in_bin "serialized_class" in > let view = new view ~chan in > (* ... *) > > Now in the case above I guess I could add an extra optional ?chan > argument, but that seems a bit ugly because it doesn't prevent users > from supplying incorrectly both ~chan and ~title, for example. > > Is there an easy way to provide two different constructors for a > class? > > Other languages do allow different sets of arguments to different > constructors for the same class quite naturally. You may consider a union type, e.g. type view_intf = View_explicitly of (int * int * ...) | View_from_channel of in_channel class view (intf : view_intf) = let (width, height, ...) = match intf with View_explicitly(w,h,...) -> (w,h,...) | View_from_channel ch -> ... in object ... end class view_explicitly ?width ?height ... = view (View_explicitly(width,height,...)) class view_from_channel ch = view (View_from_channel ch) Ok, this is not very natural, but at the end the way of implementation is hidden from the users. Other options would be independent implementations of view_explicitly and view_from_channel, which is possible if both classes have the same type (which is very natural in O'Caml but not in other languages), or you can also try to map view_from_channel directly to view, e.g. class view_from_channel ch = let (width, height, ...) = ... unmarshal ch ... in view ~width ~height ... You could also inherit from virtual classes only providing components of view, and by different ways of inheriting you get different interfaces. Just be creative. Gerd -- ------------------------------------------------------------ Gerd Stolpmann * Viktoriastr. 45 * 64293 Darmstadt * Germany gerd@gerd-stolpmann.de http://www.gerd-stolpmann.de ------------------------------------------------------------ ------------------- To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/ Beginner's list: http://groups.yahoo.com/group/ocaml_beginners ^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2003-09-02 16:07 UTC | newest] Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2003-09-02 13:45 [Caml-list] Alternate constructors for a class Richard Jones 2003-09-02 15:11 ` Michal Moskal 2003-09-02 16:07 ` Gerd Stolpmann
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox