comp.lang.ada
 help / color / mirror / Atom feed
From: "Matthew Heaney" <mheaney@on2.com>
Subject: Re: Merits of re-dispatching [LONG]
Date: Thu, 7 Feb 2002 20:06:42 -0500
Date: 2002-02-07T20:06:42-05:00	[thread overview]
Message-ID: <u668rmhvhdub11@corp.supernews.com> (raw)
In-Reply-To: 3c62524f.93369796@News.CIS.DFN.DE


"Dmitry A. Kazakov" <dmitry@elros.cbb-automation.de> wrote in message
news:3c62524f.93369796@News.CIS.DFN.DE...
> procedure Finalize (Object : in out A) is
> begin
>    Foo (A'Class (Object)); -- Re-dispatch to the child's Foo
> end Finalize;
>
 > When A is finalized as a part of AA, it re-dispatches to AA.Foo, which
> may access already finalized parts of AA! A user of A has no way to
> learn the problem from the specification of A. He must look into the
> implementation of A.Finalize. The same is valid for Initialize as
> well. Actually it is a common error among fresh baked C++ programmers
> to call virtual functions (dispatch) from constructors.

Yes, but in Ada95, operations are static by default.  You have to take
active steps in order to force the dispatching to occur.  So the scenario
you describe cannot happen accidently.

This is not the case in C++, where virtual member functions called through a
reference or pointer automatically dispatch.  So yes you can very easily
have the problem you cite in C++.  (Which is why many C++ books point out
this feature of the language.)


> Though merits of re-dispatching seem to me suspicious, it is easy to
> implement it without casting. Let we really want object's IDENTITY,
> i.e. objects which always "know" their actual type. Ada 95 perfectly
> supports this without any casting!
>
> package Self_Identifying is
>    type A is new
>       Ada.Finalization.Limited_Controlled with private;
>    type A_Ptr is access all A'Class;
>    procedure Finalize (Object : in out A);
>    procedure Foo (Object : in out A);
> private
>    type A is new
>       Ada.Finalization.Limited_Controlled with
>    record
>       Self : A_Ptr := A'Unchecked_Access; -- Class wide self-reference
>    end record;
> end Self_Identifying;

This is a horrible way to do this.  Don't use a named access type when an
access discriminant will do:

  type Handle_Type (O : access A'Class) is limited null record;

  type A is new Limited_Controlled with record
    H : Handle_Type (A'Access);
  end record;


> Is there examples where re-dispatching is really unavoidable?

There is a very simple solution to your problem: don't do it.






  parent reply	other threads:[~2002-02-08  1:06 UTC|newest]

Thread overview: 36+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2002-02-07 10:26 Merits of re-dispatching [LONG] Dmitry A. Kazakov
2002-02-07 15:03 ` Hyman Rosen
2002-02-08  1:29   ` Matthew Heaney
2002-02-08  9:16     ` Dmitry A. Kazakov
2002-02-08 18:30       ` Hyman Rosen
2002-02-09  0:10         ` Matthew Heaney
2002-02-12  8:32         ` Dmitry A. Kazakov
2002-02-12 21:37           ` Hyman Rosen
2002-02-13  9:29             ` Dmitry A. Kazakov
2002-02-13 14:32               ` Hyman Rosen
2002-02-13 19:58           ` Dave Harris
2002-02-14 15:06             ` Dmitry A. Kazakov
2002-02-16 12:10               ` Dave Harris
2002-02-18  8:57                 ` Dmitry A. Kazakov
2002-02-18 19:47                   ` Merits of re-dispatching Dave Harris
2002-02-19  9:20                     ` Dmitry A. Kazakov
2002-02-21  5:49                       ` Hyman Rosen
2002-02-21  9:04                         ` Dmitry A. Kazakov
2002-02-21 18:17                           ` Hyman Rosen
2002-02-22  9:21                             ` Dmitry A. Kazakov
2002-02-22 16:59                               ` Hyman Rosen
2002-02-25  8:51                                 ` Dmitry A. Kazakov
2002-02-08 23:51       ` Merits of re-dispatching [LONG] Matthew Heaney
2002-02-12  9:02         ` Dmitry A. Kazakov
2002-02-07 23:40 ` Nick Roberts
2002-02-08  8:56   ` Dmitry A. Kazakov
2002-02-08  1:06 ` Matthew Heaney [this message]
2002-02-08  9:48   ` Dmitry A. Kazakov
2002-02-09  0:16     ` Matthew Heaney
2002-02-08 18:10   ` Hyman Rosen
2002-02-09  0:41     ` Matthew Heaney
2002-02-08 18:33 ` Nick Roberts
2002-02-09  4:07   ` Nick Roberts
2002-02-12 10:13   ` Dmitry A. Kazakov
2002-02-14 20:57 ` Tucker Taft
2002-02-15 15:43   ` Dmitry A. Kazakov
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox