Version française
Home     About     Download     Resources     Contact us    

This site is updated infrequently. For up-to-date information, please visit the new OCaml website at

Browse thread
[Caml-list] a design problem requiring downcasting? (long)
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: 2002-09-26 (15:19)
From: nadji@n...
Subject: Re: [Caml-list] a design problem requiring downcasting? (long)

If I understood your problem, Jacques Garrigue has shown a way
to allow "safe" downcast, that is to say that if you can't downcast you
cleanly get an exeption. You are required to register your class for
all the downcasts you wants, and it will work only for them (i.e. if
you don't register you can't downcast). This is the "memo" class
in the code below.
Following this idea, your simulation manager has to define all the interfaces it
will be using, and the simulations have to register themselves before
beeing used.
Code follows :

(* In simulation infrastructure *)
module Sim = struct
  class ['ct] memo = object
    val h = Hashtbl.create 0
    method add : 'ct -> unit = fun x -> Hashtbl.add h (Obj.repr x) x
    method get : 'a . 'a -> 'ct = fun x -> Hashtbl.find h (Obj.repr x)

  class type base = object
    method simname : string

  class type ct1 = object
    inherit base
    method a : string

  class type ct2 = object
    inherit base
    method b : int
    method bin : 'a. (#ct1 as 'a) -> string

  class type ct3 = object
    inherit base
    method a : string
    method b : int

  let h1 : ct1 memo = new memo
  let h2 : ct2 memo = new memo
  let h3 : ct3 memo = new memo

  let nbsims = ref 0
  let thesims : (int, base) Hashtbl.t = Hashtbl.create 0

  let test a b =
    let obj1 = h1#get a in
    let obj2 = h2#get b in
    obj2#bin obj1

(* in sim 1 *)
class class1 = object (self)
  method simname = "sim1"
  method a = "foo"
  method b = 4
    Sim.h1#add (self:>Sim.ct1);
    Sim.h3#add (self:>Sim.ct3);

(* in sim 2 *)
class class2 = object (self)
  method simname = "sim2"
  method b = 5
  method bin : 'a. (#Sim.ct1 as 'a) -> string =
    fun x -> x#a

    Sim.h2#add (self:>Sim.ct2);

This is only a suggestion, there are certainly other ways
to achieve what you want.

To unsubscribe, mail Archives:
Bug reports: FAQ:
Beginner's list: