codecamp

Ada子单元和私有子单元

    在一个比较大的软件系统开发中,往往会出现某个程序包变得很大这种情况。对于需要这些新添功能的用户来说,这是好事;而对于其它用户来说,却要花费更多的时间编译更大的程序包,无疑很让人不舒服。在这种情况下,就有了子单元这种处理方法:将逻辑上单一的程序包分割成几个实际上独立的程序包,子单元从逻辑上讲是源程序包的扩展,但却以独立的文件形式存在,如将上例分割:

000 -- filename:account.ads
001 package Accounts is
002    type account is private; 
003    My_Account : constant account;
004    procedure withdraw(account:in out account; amount :in Positive);
005    procedure deposit (account:in out account; amount :in Positive);
006    function balance(account: in out account) return Integer;
007 private 
008    type account is 
009    record
010       account_id : positive;
011       balance : integer;
012    end record;
013    My_Account:constant account := (78781, 122); 
014 end accounts;

000 --filename:accounts_more_stuff.ads
001 package accounts.more_stuff is
002    function create(account:in out account;account_id :Positive) return Boolean; 
003    function cancel(account:in out account;account_id :Positive) return Boolean;
004 end accounts.more_stuff;

    程序包 accounts.more_stuff 是accounts的子程序包。这个例子的实际效果与上例一样,包括作用域等等,只是从形式上来说分成了两个不同程序包,编译时也是分别编译。对于用户来讲,使用上的区别还是有一点:

with accounts.more_stuff;
procedure test is
   ...
begin
   ...
   accounts.more_stuff.create (his_account,7827);
   accounts.deposit(his_account,7000);
   ...
end test;

   上面虽然只 with 了accounts.more_stuff,但能使用accounts里的资源,默认情况下已作了 with accounts 的工作,如果 accounts 还有其它子单元,则不会自动 with 那些子单元。 use 和 with 不一样,它不会在 use accounts.more_stuff 时默认也 use accounts:

with accounts.more_stuff; use accounts; use more_stuff;

procedure test is
   ...
begin
   create (his_account,7827);
   deposit(his_account,7000);
   ...
end test;

   子单元的使用应该说还是和原来差不多。另外注意一下,程序使用程序包时会将程序包内的所有子程序都载入内存,因此有内存浪费现象;如果一个程序包内一部份资源使用频率较高,另一部份资源较少使用,则可以将这两部份资源分成两个子单元,以提高效率,这方面的典型情况就是程序包 Characters.Latin_1,Characters.Handling,具体见 第13章。

私有子单元

    私有子单元允许创建的子单元只能被源程序包所使用,如:

000 --filename:accounts_more_stuff.ads
001 private package accounts.more_stuff is
002    function create(account:in out account;account_id :Positive) return Boolean;
003    function cancel(account:in out account;account_id :Positive) return Boolean;
004 end accounts.more_stuff;

    这样的话 create 和 cancle 对于用户来说是不可见的,只能被程序包 accounts 所使用。

    子单元除了上述的使用方法外,也可直接在其它程序包内部:

package parent_name is

...

package child_name is

...

end child_name;

...

end parent_name;


Ada私有类型和有限专用类型
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }