Message-Id: <9705211403.AA33541@idse.heidelbg.ibm.com>
To: Donald Syme <Donald.Syme@cl.cam.ac.uk>
Subject: Re: OCaml's subtyping better than advertised?
In-Reply-To: (Your message of Tue, 20 May 97 15:22:28 N.)
<E0wTpo6-0001pa-00@heaton.cl.cam.ac.uk>
Date: Wed, 21 May 97 16:03:32 +0100
From: Wolfgang Lux <lux@heidelbg.ibm.com>
> One thing I'm wondering is why the syntax for O'Caml types has no
> way of specifying interface inheritance easily? For
> example, I want to define some object type (nb. I'm defining
> a type not a class):
>
> type widget = < windowid: unit -> int,
> set_height: int -> unit,
> height: unit -> int,
> .. >;
>
> [ Aside: at the moment I don't seem to be able to do this
> in O'Caml, without defining a class, because the type
> variable ".." is free. Perhaps there needs to be come
> mechanism for defining new object types with the same
> "#<type>" behaviour of the types generated by classes?
> This would then allow me to write "#widget" as a type
> without having defined a class widget (i.e. without
> having committed to an implementation) ]
>
This *can* easily be done by using virtual methods, e.g.
virtual class widget () =
virtual windowid: int (* unit -> ... is not necessary here! *)
virtual set_height: int -> unit
virtual height: int (* unit -> ... not necessary as well *)
end
> If I then want to define some structural subtype of #widget
> (nb. not necessarily implemented by a subclass), I have to write out all
> the methods again:
>
> type textual_widget = < windowid: unit -> int,
> set_height: int -> unit,
> height: unit -> int,
> insert : string * int -> unit,
> get : int * int -> string
> .. >;
>
This is easily done as well:
virtual class textual_widget () =
inherit widget ()
virtual insert : string -> int -> unit
virtual get : int -> int -> string
end
>
> Yours,
> Don Syme
Regards
Wolfgang
>
> P.S. Apologies for no french version.
Apologies from me as well.
---- Wolfgang Lux WZH Heidelberg, IBM Germany Phone: +49-6221-59-4546 Fax: +49-6221-59-3500 Internet: lux@heidelbg.ibm.com Office: mazvm01(lux)
This archive was generated by hypermail 2b29 : Sun Jan 02 2000 - 11:58:11 MET