From: Dennis Hoppe <dennis.hoppe@hoppinet.de>
Subject: Passing an instance of a generic child as a generic parameter
Date: Sat, 14 Jun 2008 22:54:46 +0200
Date: 2008-06-14T22:54:46+02:00 [thread overview]
Message-ID: <g31b6m$agl$1@aioe.org> (raw)
Hi there,
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.
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);
parent Parent is
type Object is abstract tagged null record;
procedure Print (Obj: in Object; X : in XX.Object'Class);
end Parent;
-- GENERIC PARENT 'parent' ADB
with Ada.Text_IO;
package body Parent is
procedure Print (Obj : in Object; X : in XX.Object'Class) is
begin
X.Solve;
Ada.Text_IO.Put (Integer'Image(A));
end;
end Parent;
-- GENERIC CHILD of 'parent' ADS
with Parent;
generic
-- omitted
package Parent.Child is
type Instance is new Parent.Object with null record;
overriding
procedure Print (Obj : in Instance; X : in XX.Object'Class);
end Parent.Child;
-- GENERIC CHILD of 'parent' ADB
with Ada.Text_IO;
package body Parent.Child is
procedure Print (Obj : in Instance; X : in XX.Object'Class) is
begin
Ada.Text_IO.Put_Line ("child");
X.Solve;
end;
end Parent.Child;
-- TESTSUITE
with Parent;
with Other;
with Other.Child;
procedure Test is
A : Integer := 2;
package O is new Other (A);
package E is new O.Child;
package P is new Parent (A, O);
procedure Calls (Obj : P.Object'Class; X : in O.Object'Class) is
begin -- Calls
P.Print (Obj, X);
end Calls;
X : C.Instance;
OO : O.Object;
EE : E.Instance;
begin -- Test
Calls (X, OO);
end Test;
Ok, if I declare 'package P is new Parent (A, O);' and call the Calls
procedure with 'Calls (X, OO);' all went fine, because O is an instance
of Other. I want further to declare my package P with a child unit of
Other, so that:
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
end Test;
Is it possible to declare a generic package parameter to accept
children, too? Or should I better solve this challenge with another
approach?
generic
A: Integer;
with package XX is new Other (A);
..
... won't do it.
Thanks in advance,
Dennis
next reply other threads:[~2008-06-14 20:54 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-06-14 20:54 Dennis Hoppe [this message]
2008-06-15 8:57 ` Passing an instance of a generic child as a generic parameter Dmitry A. Kazakov
2008-06-15 9:04 ` Dmitry A. Kazakov
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