使用通用包

时间:2011-05-04 08:24:31

标签: ada

我的问题非常简单。我有2个通用包。我使用每个包2次(一次用于整数和字符串一次)。我有一个“主”文件,使用用户选择的包。 - package1 with integer - 或包含字符串的package1 - 或包含整数的package2 - 或包含字符串

的package2
procedure main is
     package aB is new package1(integer, false, afficheInteger, true);
    --package aB is new package1(Unbounded_String, true, afficheUnbounded, true);
    --package aB is new package2(1,integer, false, afficheInteger, true);
    --package aB is new package2(1, Unbounded_String, true, afficheUnbounded, true);

开始         aB.init();         .....

目标是为4个包使用相同的代码(main)。

不幸的是我找不到如何正确地做到这一点。目前我把包裹列表和我评论我不使用的包裹。是否有可能在开始时生成伪if或在begin中初始化包?也许在main函数中有一个package参数?

非常感谢,对不起我的英语!

更新:

是否可以在函数中传递package参数?像这样:

procedure init_paquetage1_int is
    package aB is new packA(integer, false, afficheInteger, true);
begin
    main(aB);
end init_paquetage1_int; 

procedure main(aB : packA) is
begin
    aB.init();
    ....
end main;

它不起作用。

2 个答案:

答案 0 :(得分:6)

行。首先,我没有看到任何方式你希望这个工作,除非你在包中调用的例程具有相同的参数配置文件,无论使用哪种类型。通常,通用包将至少有一个例程,它使用您在例程的参数中实例化的类型之一(或作为返回类型)。

如果您要使用的例程确实具有相同的配置文件,我可以想到您可以做的一些事情。第一种方法是使用您要调用的a pointer to the routine,并将其传递给。{/ p>

   type Init_Routine is access procedure ();
begin
   main (ab.Init'access);

第二种方法是使您的通用包都包含从公共父abstract标记类型派生的标记类型,该类型具有您要调用的例程,在父级中定义为abstract例程。如果这样做,您可以使用动态分派在运行时在它们之间进行选择。

package Parent is
   type Instance is abstract tagged null record;
   type Dispatching_Instance_Ptr is access all Instance;
   procedure Init (I : in out Instance) is abstract;
end Parent;

generic 
   --// Whatever your generic parameters are...
Package1 is
    type Instance is new Parent.Instance with null record;
    procedure Init (I : in out Instance);
    ...
end Package1;
--// (Package2 looks similar)

简化为调用代码:

    Choice : Parent.Dispatching_Instance_Ptr;
begin
    --// Let's assume the user "chooses" package aB
    Choice := new'aB.Instance;
    main (Choice);

...和主要:

procedure main(xx : in Parent.Dispatching_Instance_Ptr) is
begin
   Parent.Init(xx.all);  --// This should dynamic dispatch to the proper init routine
   ....
end main;

注意:我没有通过编译器运行它,因此可能存在小问题。我已经找到并修复了一对。

答案 1 :(得分:2)

每次实例化一个通用包时,它都被视为一个单独的包。因此,您需要为每个实例化使用不同的包名称。

procedure main is
     package aA is new package1(integer, false, afficheInteger, true);
     package aB is new package1(Unbounded_String, true, afficheUnbounded, true);
     package aC is new package2(1,integer, false, afficheInteger, true);
     package aD is new package2(1, Unbounded_String, true, afficheUnbounded, true);
...

您现在可以将其中每个用作单独的包。

aA.init();
aB.init();
...

您可以将过程作为参数传递,但不能传递包。

如果您仍然对通用内容感到困惑,建议您阅读http://en.wikibooks.org/wiki/Ada_Programming/Generics