我的问题很简单.我有2个通用包.我使用每个包2次(一次用于整数和字符串一次).我有一个"主"文件,使用用户选择的包. - package1 with integer - 或package1 with string - 或package2 with integer - 或package2 with string
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);
Run Code Online (Sandbox Code Playgroud)
开始aB.init(); .....
目标是为4个包使用相同的代码(main).
不幸的是我找不到如何正确地做到这一点.目前我把包裹列表和我评论我不使用的包裹.是否有可能在开始时生成伪if或在begin中初始化包?也许在main函数中有一个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;
Run Code Online (Sandbox Code Playgroud)
它不起作用.
好.首先,我没有看到任何方式你希望这个工作,除非你在包中调用的例程具有相同的参数配置文件,无论使用哪种类型.通常,通用包将至少有一个例程,它使用您在例程的参数中实例化的类型之一(或作为返回类型).
如果你想要使用的例程实际上具有相同的配置文件,我可以想到你可以做的一些事情.第一种是使用指向要调用的例程的指针,并将其传入.
type Init_Routine is access procedure ();
begin
main (ab.Init'access);
Run Code Online (Sandbox Code Playgroud)
第二种方法是使您的通用包都包含从公共父标记类型派生的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)
Run Code Online (Sandbox Code Playgroud)
跳到调用代码:
Choice : Parent.Dispatching_Instance_Ptr;
begin
--// Let's assume the user "chooses" package aB
Choice := new'aB.Instance;
main (Choice);
Run Code Online (Sandbox Code Playgroud)
...和主要:
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;
Run Code Online (Sandbox Code Playgroud)
注意:我没有通过编译器运行它,因此可能存在小问题.我已经发现并修复了一对.