我的问题非常简单。我有2个通用包。我使用每个包2次(一次用于整数和字符串一次)。我有一个“主”文件,使用用户选择的包。 - package1 with integer - 或包含字符串的package1 - 或包含整数的package2 - 或包含字符串
的package2procedure 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;
它不起作用。
答案 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