English version
Accueil     À propos     Téléchargement     Ressources     Contactez-nous    

Ce site est rarement mis à jour. Pour les informations les plus récentes, rendez-vous sur le nouveau site OCaml à l'adresse ocaml.org.

Browse thread
[Caml-list] coercions from superclass to subclass?
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: 2002-06-07 (10:47)
From: Jacques Garrigue <garrigue@k...>
Subject: Re: [Caml-list] coercions from superclass to subclass?
From: Michael Vanier <mvanier@cs.caltech.edu>

> 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
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