From mboxrd@z Thu Jan 1 00:00:00 1970 Received: (from majordomo@localhost) by pauillac.inria.fr (8.7.6/8.7.3) id SAA09692; Tue, 2 Sep 2003 18:07:58 +0200 (MET DST) X-Authentication-Warning: pauillac.inria.fr: majordomo set sender to owner-caml-list@pauillac.inria.fr using -f Received: from nez-perce.inria.fr (nez-perce.inria.fr [192.93.2.78]) by pauillac.inria.fr (8.7.6/8.7.3) with ESMTP id SAA05005 for ; Tue, 2 Sep 2003 18:07:56 +0200 (MET DST) Received: from mail.npc.de (fw.npc.de [62.225.140.214]) by nez-perce.inria.fr (8.11.1/8.11.1) with ESMTP id h82G7sT02550 for ; Tue, 2 Sep 2003 18:07:56 +0200 (MET DST) Received: from styx.ffm.npc.de (lion.npc.de [192.168.129.1]) by mail.npc.de (Postfix) with ESMTP id D6469E7; Tue, 2 Sep 2003 18:07:47 +0200 (CEST) Received: from hera.ffm.npc.de (hera.ffm.npc.de [192.168.130.8]) by styx.ffm.npc.de (Postfix STYX NPC GmbH) with ESMTP id 9BF1778E0; Tue, 2 Sep 2003 18:07:40 +0200 (CEST) Received: from ares.ffm.npc.de (ares.ffm.npc.de [192.168.130.32]) by hera.ffm.npc.de (Postfix HERA NPC GmbH) with ESMTP id 25560159BB; Tue, 2 Sep 2003 18:07:40 +0200 (CEST) Received: from ares.ffm.npc.de (ares.ffm.npc.de [192.168.130.32]) by ares.ffm.npc.de (Postfix ARES NPC GmbH) with ESMTP id C80DE183C; Tue, 2 Sep 2003 18:07:39 +0200 (CEST) Subject: Re: [Caml-list] Alternate constructors for a class From: Gerd Stolpmann To: Richard Jones Cc: caml-list@inria.fr In-Reply-To: <20030902134537.GA7309@redhat.com> References: <20030902134537.GA7309@redhat.com> Content-Type: text/plain Content-Transfer-Encoding: 7bit X-Mailer: Ximian Evolution 1.0.8 Date: 02 Sep 2003 18:07:39 +0200 Message-Id: <1062518859.1092.17.camel@ares> Mime-Version: 1.0 X-Loop: caml-list@inria.fr X-Spam: no; 0.00; caml-list:01 gerd:01 stolpmann:01 untitled:99 marshall:01 serialized:01 incorrectly:01 intf:01 intf:01 unmarshal:01 gerd:01 stolpmann:01 viktoriastr:01 64293:01 darmstadt:01 Sender: owner-caml-list@pauillac.inria.fr Precedence: bulk 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