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 MAA23274; Fri, 7 Jun 2002 12:47:35 +0200 (MET DST) X-Authentication-Warning: pauillac.inria.fr: majordomo set sender to owner-caml-list@pauillac.inria.fr using -f 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 MAA23269 for ; Fri, 7 Jun 2002 12:47:34 +0200 (MET DST) Received: from kurims.kurims.kyoto-u.ac.jp (kurims.kurims.kyoto-u.ac.jp [130.54.16.1]) by concorde.inria.fr (8.11.1/8.11.1) with ESMTP id g57AlXH11481 for ; Fri, 7 Jun 2002 12:47:33 +0200 (MET DST) Received: from localhost (suiren.kurims.kyoto-u.ac.jp [130.54.16.25]) by kurims.kurims.kyoto-u.ac.jp (8.9.3/3.7W) with ESMTP id TAA03740; Fri, 7 Jun 2002 19:47:27 +0900 (JST) To: mvanier@cs.caltech.edu Cc: caml-list@inria.fr Subject: Re: [Caml-list] coercions from superclass to subclass? In-Reply-To: <200206062215.g56MF5w19818@orchestra.cs.caltech.edu> References: <200206062215.g56MF5w19818@orchestra.cs.caltech.edu> X-Mailer: Mew version 1.94.2 on Emacs 20.7 / Mule 4.0 (HANANOEN) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit Message-Id: <20020607194726N.garrigue@kurims.kyoto-u.ac.jp> Date: Fri, 07 Jun 2002 19:47:26 +0900 From: Jacques Garrigue X-Dispatcher: imput version 20000228(IM140) Sender: owner-caml-list@pauillac.inria.fr Precedence: bulk From: Michael Vanier > I understand that there is no mechanism to coerce from a superclass to a > subclass in ocaml (i.e. the equivalent of C++'s run-time type > identification or java's instanceof operator). Are there any plans to add > such a capability in the future? The workaround was already posted. Look out Remi Vanicat's message for a space-safe implementation. Note that you need a coercion if you want to do it in an initializer class c () = object (self) initializer register (self :> c) method m = 1 end However this does not work with ocaml 3.04. You must write (self : < m : _ ; .. > :> c) enumerating all the methods. (self :> c) will work in ocaml 3.05. You can also choose to write a wrapper to the constructor let new_c () = let o = new c () in register o; o but this won't register automatically all subclasses. The moral reason for the absence of downcasts is not that this is unacceptable to use downcasts (yet, better to avoid it). The problem is that subtyping in ocaml is not by name, but by structure. Checking subtyping would require a complex run-time type (not available currently), and would be costly. Moreover, you may produce objects whose type is not fully known, making it even worse. Jacques Garrigue ------------------- 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