comp.lang.ada
 help / color / mirror / Atom feed
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



  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