caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
* [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;
as well as URLs for NNTP newsgroup(s).