From: Dmitry A. Kazakov <mailbox@dmitry-kazakov.de>
Subject: Re: Q: Endless loop by dispatching
Date: Fri, 11 Jul 2003 12:01:51 +0200
Date: 2003-07-11T12:01:51+02:00 [thread overview]
Message-ID: <uu0tgv8ru6be67limc43p4itiu46s4ac19@4ax.com> (raw)
In-Reply-To: un82u-4kb.ln1@boavista.snafu.de
On Fri, 11 Jul 2003 10:22:54 +0200, Michael Erdmann
<michael.erdmann@snafu.de> wrote:
>i got a problem with the following code fragment below. The Idea is that
>the procedure Serialize defines the strategy how to display object which
>are derived from A.Object. Searialize simply dispatches into the class
>by calling a procedure Write, which does the job for the class.
[...]
>In the following fragment i am defining a package B with an
>derived objec B.Object as below. When an instance of B.Object
>shall be serialized, the element of the super class (A.Object)
>shall be serialzed as well. The code looks nice and compiles
>but does not work, since the Serialize dispatches again with
>Object.B even ther was a a case given A.Object( This ).
[...]
>Does any body know, what this loop causes?! I am not sure
>if this is a bug or simply i missed the point.
Serialize is class-wide and a view conversion does not change the
tag..I.e. you have a re-dispatching case. Re-dispatching is a
dangerous thing. [I would like it removed from Ada]
So Serialize re-dispatches to B.Write which again calls Serialize.
From design point of view, one should never call class-wide routines
from specific ones, this warranties that dispatch happens only once.
I suppose that you want sort of procedure expansion instead of
complete overriding, if so, then you should explicitly call parent's
Write, similarly as one does it for Initialize/Finalize:
package body B is
...
procedure Write (This : in Object) is
begin
-- A.Serialize( A.Object( This ) );
A.Write (A.Object (This)); -- Write parent's things
Put_Line( "Q =" & Natural'Image(This.Q));
end Write;
BTW, why do not you use Ada.Streams? It is for things like this.
---
Regards,
Dmitry Kazakov
www.dmitry-kazakov.de
next prev parent reply other threads:[~2003-07-11 10:01 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2003-07-11 8:22 Q: Endless loop by dispatching Michael Erdmann
2003-07-11 9:46 ` Jean-Pierre Rosen
2003-07-11 15:19 ` Michael Erdmann
2003-07-11 10:01 ` Dmitry A. Kazakov [this message]
2003-07-11 15:07 ` Q: " Michael Erdmann
2003-07-12 1:41 ` Jeffrey Carter
2003-07-14 8:48 ` Dmitry A. Kazakov
2003-07-14 18:38 ` Randy Brukardt
2003-07-15 8:47 ` Dmitry A. Kazakov
2003-07-15 17:23 ` Randy Brukardt
2003-07-16 8:08 ` Dmitry A. Kazakov
2003-07-16 17:44 ` Robert I. Eachus
2003-07-17 1:57 ` Robert A Duff
2003-07-18 9:10 ` Dale Stanbrough
2003-07-18 20:26 ` Robert I. Eachus
2003-07-18 21:35 ` tmoran
2003-07-19 0:25 ` Robert I. Eachus
2003-07-19 2:30 ` tmoran
2003-07-19 5:48 ` Robert I. Eachus
2003-07-21 8:38 ` Dmitry A. Kazakov
2003-07-21 10:08 ` Robert I. Eachus
2003-07-21 13:21 ` Dmitry A. Kazakov
2003-07-21 18:51 ` Robert I. Eachus
2003-07-22 7:41 ` Dmitry A. Kazakov
2003-07-22 10:36 ` Lutz Donnerhacke
2003-07-22 12:11 ` Dmitry A. Kazakov
2003-07-22 12:18 ` Lutz Donnerhacke
2003-07-22 14:46 ` Dmitry A. Kazakov
2003-07-22 15:11 ` Lutz Donnerhacke
2003-07-23 8:12 ` Dmitry A. Kazakov
2003-07-19 14:44 ` Chad R. Meiners
2003-07-20 12:36 ` Robert I. Eachus
2003-07-11 16:27 ` T. Kurt Bond
2003-07-12 8:37 ` Michael Erdmann
2003-07-15 7:11 ` Kenneth Almquist
replies disabled
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox