From: "Dmitry A. Kazakov" <mailbox@dmitry-kazakov.de>
Subject: Re: Passing an instance of a generic child as a generic parameter
Date: Sun, 15 Jun 2008 11:04:16 +0200
Date: 2008-06-15T11:04:16+02:00 [thread overview]
Message-ID: <17dp09yvw69tz.v0lkd9ukna30$.dlg@40tude.net> (raw)
In-Reply-To: k3r5ww9d81az$.1aciwfd23b0to.dlg@40tude.net
On Sun, 15 Jun 2008 10:57:44 +0200, Dmitry A. Kazakov wrote:
> On Sat, 14 Jun 2008 22:54:46 +0200, Dennis Hoppe wrote:
>
>> I'm trying to pass an instance of a generic child unit to another
>> generic package, but the only syntax, I could found specifies a concrete
>> generic package.
>
> Ada does not have interfaces of packages. A generic child package is not an
> implementation of the parent's package interface, which could then be
> referenced as a formal parameter of some other generic package. So the
> answer is no.
>
> But it seems to me that your example does not require that stuff:
>
>> Let's first have a look at my pathological example:
>>
>> -- GENERIC PARENT 'other' ADS
>> generic
>> B : Integer;
>> package Other is
>> type Object is tagged null record;
>> procedure Solve (Obj : Object);
>> end Other;
>>
>>
>> -- GENERIC PARENT 'other' ADB
>> with Ada.Text_IO;
>>
>> package body Other is
>> procedure Solve (Obj : Object) is
>> begin
>> Ada.Text_IO.Put_Line ("solved");
>> end;
>> end Other;
>>
>> -- GENERIC CHILD of 'other' ADS
>> with Other;
>>
>> generic
>> -- omitted
>> package Other.Child is
>> type Instance is new Other.Object with null record;
>>
>> overriding
>> procedure Solve (Obj : in Instance);
>> end Other.Child;
>>
>> -- GENERIC CHILD of 'other' ADB
>> with Ada.Text_IO;
>>
>> package body Other.Child is
>> procedure Solve (Obj : in Instance) is
>> begin
>> Ada.Text_IO.Put ("other child");
>> end;
>> end Other.Child;
>>
>> -- GENERIC PARENT 'parent' ADS
>> with Other;
>>
>> generic
>> A: Integer;
>> with package XX is new Other (A);
>
> type Object is new XX.Object with null record;
type Object is new XX.Object with private; -- Of course
>> parent Parent is
>> type Object is abstract tagged null record;
>
> remove this
>
>> procedure Print (Obj: in Object; X : in XX.Object'Class);
>> end Parent;
>
> Now Parent takes an instance of Other, which determines the class of
> Objects to use. The class is parametrized by A. The formal type Object is
> an instance from the class to deal with.
>
> BTW, you could also remove the parameter A:
>
> generic
> with package XX is new Other (<>); -- Brings some A with it
> type Object is new XX.Object with null record;
>
>> parent Parent is
>
> [...]
>
>> procedure Test is
>> A : Integer := 2;
>> package O is new Other (A);
>> package E is new O.Child;
>> package P is new Parent (A, E); -- O is replaced by the child E
>> .. -- compiler error expected
>
> package P is new Parent (A, O, E.Instance);
--
Regards,
Dmitry A. Kazakov
http://www.dmitry-kazakov.de
next prev parent reply other threads:[~2008-06-15 9:04 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-06-14 20:54 Passing an instance of a generic child as a generic parameter Dennis Hoppe
2008-06-15 8:57 ` Dmitry A. Kazakov
2008-06-15 9:04 ` Dmitry A. Kazakov [this message]
2008-06-15 12:04 ` Dennis Hoppe
replies disabled
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox