From: "Dmitry A. Kazakov" <mailbox@dmitry-kazakov.de>
Subject: Re: How to test object hierarchy
Date: Fri, 19 Dec 2003 11:53:07 +0100
Date: 2003-12-19T11:53:07+01:00 [thread overview]
Message-ID: <brukur$7il7a$2@ID-77047.news.uni-berlin.de> (raw)
In-Reply-To: 93172edb.0312181024.9a536b2@posting.google.com
Pierre Favier wrote:
> I am wondering how to test for two objects which types both derive from a
> common root type if one of them derives from the other. In short, I am
> trying to run something like the following code which does not compile
> because the Class attribute applies to types or subtypes but not to
> objects:
>
> procedure Test_Hierarchy (Obj1 : in Root_Object'Class;
> Obj2 : in Root_Object'Class) is
> begin
>
> if Obj1 in Obj2'Class then
>
> -- Do something
>
> else
>
> -- Do something else
>
> end if;
>
> end Test_Hierarchy;
>
> Any suggestions on how to achieve the intended effect?
Unfortunately tags have no "<" defined. Otherwise, one could simply write
Obj1'Tag < Obj2'Tag (in the sense Obj1 <: Obj2).
However there is a trick to achieve what you want using dispatching. The
idea is to emulate multiple dispatch and so you go as follows:
procedure Do_It -- Obj1 :>= Obj2
( Obj1 : in Root_Object'Class;
Obj2 : in Root_Object'Class
);
procedure Test_Hierarchy
( Obj1 : in Root_Object; -- Dispatches in this argument
Obj2 : in Root_Object'Class;
Recursion : Boolean := False
) is
begin
if Recursion or else Obj2 not in Root_Object'Class then
Do_It (Obj1, Obj2); -- Deal with Obj1 :>= Obj2
else
Test_Hierarchy (Obj2, Obj1, True); -- Dispatch again
end if;
end Test_Hierarchy;
type Derived_Object is new Root_Object with ...;
procedure Test_Hierarchy
( Obj1 : in Derived_Object;
Obj2 : in Root_Object'Class;
Recursion : Boolean := False
) is
begin
if Recursion
or else Obj2 not in Derived_Object'Class
or else Obj2 in Derived_Object
then
Do_It (Obj1, Obj2); -- Deal with Obj1 :>= Obj2
else
Test_Hierarchy (Obj2, Obj1, True); -- Dispatch again
end if;
end Test_Hierarchy;
You have to override Test_Hierarchy for each new type, but I suppose that
"do something" in your code is dispatching anyway. When Test_Hierarchy is
not commutative it gets a bit more complicated, but I think you have got
the idea.
--
Regards,
Dmitry A. Kazakov
www.dmitry-kazakov.de
next prev parent reply other threads:[~2003-12-19 10:53 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2003-12-18 18:24 How to test object hierarchy Pierre Favier
2003-12-19 0:15 ` Stephen Leake
2003-12-19 7:45 ` Pierre Favier
2003-12-19 10:53 ` Dmitry A. Kazakov [this message]
2003-12-19 14:35 ` Hyman Rosen
2003-12-19 17:07 ` Dmitry A. Kazakov
2003-12-19 23:26 ` Robert A Duff
2003-12-20 18:20 ` Robert I. Eachus
2003-12-19 17:25 ` Georg Bauhaus
2003-12-20 11:13 ` Dmitry A. Kazakov
2003-12-21 4:34 ` Georg Bauhaus
2003-12-21 13:43 ` Dmitry A. Kazakov
2003-12-21 19:58 ` Dmytry Lavrov
2003-12-22 1:19 ` Robert I. Eachus
2003-12-22 10:09 ` Dmitry A. Kazakov
2003-12-22 17:33 ` Robert I. Eachus
2003-12-23 10:49 ` Dmitry A. Kazakov
2003-12-22 10:05 ` Dmitry A. Kazakov
2003-12-19 17:24 ` Nick Roberts
replies disabled
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox