2011-05-04 49 views
2

我的問題很簡單。我有2個通用包。我使用每個包2次(一次用於整數和字符串一次)。我有一個使用用戶選擇的軟件包的「主」文件。 - 包1與整數 - 或包1與字符串 - 或包2與整數 - 或包2與串使用通用包

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個軟件包使用相同的代碼(主)。

不幸的是我找不到如何正確地做到這一點。目前,我把軟件包列表和評論我不使用的軟件包。如果在開始階段或初始化包中是否可以僞造?也許與主函數中的包參數?

非常感謝我的英語!

更新:

是否有可能在函數中傳遞包參數?像這樣:

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

是否希望用戶在編譯時作爲預運行配置設置或運行時進行此「選擇」? – 2011-05-04 13:50:55

回答

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

+2

正確,軟件包名稱不能超過。你也可以傳遞一個包作爲一個泛型實例(很少需要)。見http://en.wikibooks.org/wiki/Ada_Programming/Generics#Generic_instances_of_other_generic_packages – NWS 2011-05-04 12:29:20

+0

我不知道!它在我推薦的頁面上。我需要更徹底地閱讀我推薦的參考資料!感謝您指出了這一點。 – dalenkruse 2011-05-04 15:21:54

+0

我越想它,它越有意義,因爲你保證在泛型中使用一組方法。 – NWS 2011-05-04 20:26:21

6

確定。首先,我看不出有什麼辦法可以使它工作,除非你在程序包中調用的例程具有相同的參數配置文件,而不管使用哪種類型。通常,一個通用的包至少有一個例程使用例程的參數(或返回類型)中實例化的類型之一。

如果你想使用的程序實際上有相同的配置文件,我可以想一些你可以做的事情。第一種方法是使用a pointer to the routine要呼叫,並傳遞英寸

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; 

注意:我沒有通過編譯器運行此,所以可能有小問題。我已經找到並修復了一對夫婦。