From: "Matthew Heaney" <matthew_heaney@acm.org>
Subject: Re: How to?: Re-dispatching within an inherited method
Date: 1999/08/17
Date: 1999-08-17T00:00:00+00:00 [thread overview]
Message-ID: <37b9a823@news1.us.ibm.net> (raw)
In-Reply-To: 7onk8f$2qg@hobbes.crc.com
In article <7onk8f$2qg@hobbes.crc.com> , "David C. Hoos, Sr."
<david.c.hoos.sr@ada95.com> wrote:
> Yes. You need to type convert the actual parameter in the call to
> Widget'Class to make the call a dispatching call. See RM 95 3.9.2 (1, 5).
>
> As in the example:
>
> with Ada.Text_IO;
> package body A is
>
> procedure Run_Widget (The_Widget : Widget'Class) is
> begin
> Ada.Text_IO.Put_Line
> ("in Run_Widget (The_Widget : Widget): Size =" &
> Positive'Image (Widget_Size (Widget'Class (The_Widget))));
Did you really mean to declare the formal parameter The_Widget in operation
Run_Widget as having type Widget'Class? If so, then there's no need for
your explicit conversion of The_Widget to type Widget'Class, because that's
already its type.
The other problem with this solution is that Run_Widget is no longer
primitive, because it takes a class-wide parameter. The operation is NOT
inherited during derivation.
I suspect that what you really meant was
procedure Run_Widget (The_Widget : Widget) is
begin
... Widget_Size (Widget'Class (The_Widget)) ...
end;
> end Run_Widget;
>
> function Widget_Size (The_Widget : Widget) return Positive is
> begin
> return 1;
> end Widget_Size;
>
> end A;
>
>
> package A is
> type Widget is tagged null record;
> procedure Run_Widget (The_Widget : Widget'Class);
I think you want this:
procedure Run_Widget (The_Widget : Widget);
> function Widget_Size (The_Widget : Widget) return Positive;
> end A;
>
> package body B is
> function Widget_Size (The_Widget : BigWidget) return Positive is
> begin
> return 10;
> end Widget_Size;
> end B;
>
> with A;
> package B is
> type BigWidget is new A.Widget with null record;
> function Widget_Size (The_Widget : BigWidget) return Positive;
> end B;
>
> with A;
> with B;
> procedure Glover is
>
> The_Widget : A.Widget;
> The_BigWidget : B.BigWidget;
>
> begin
>
> A.Run_Widget (The_Widget);
> A.Run_Widget (The_BigWidget);
With the change, you can say:
B.Run_Widget (The_BigWidget);
and all is well.
> end Glover;
--
Matt
It is impossible to feel great confidence in a negative theory which has
always rested its main support on the weak points of its opponent.
Joseph Needham, "A Mechanistic Criticism of Vitalism"
next prev parent reply other threads:[~1999-08-17 0:00 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
1999-08-09 0:00 How to?: Re-dispatching within an inherited method Anthony E. Glover
1999-08-09 0:00 ` David C. Hoos, Sr.
1999-08-17 0:00 ` Matthew Heaney [this message]
1999-08-17 0:00 ` David C. Hoos, Sr.
1999-08-18 0:00 ` Matthew Heaney
1999-08-18 0:00 ` Anthony E. Glover
1999-08-19 0:00 ` Matthew Heaney
1999-08-21 0:00 ` Anthony E. Glover
replies disabled
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox