Ada私有類型和有限專用類型

2018-12-11 15:14 更新

私有類型   

    到目前為止,我們見過的在程序包內(nèi)定義的數(shù)據(jù)類型,只要使用with語句,我們都能對它進(jìn)行任意的處理,沒有什么限制。這在有些情況下,會(huì)引起麻煩。比方說創(chuàng)建了一套函數(shù)庫,如果在該函數(shù)庫里的數(shù)據(jù)類型能被用戶自由處理----創(chuàng)建新類型,加減乘除運(yùn)算.....用戶又頻繁使用的話,會(huì)使用戶程序相當(dāng)依賴于這些數(shù)據(jù)類型,而函數(shù)庫的創(chuàng)建者為了提高效率或其它什么原因,需要改變這些數(shù)據(jù)類型---取消,重寫或合并,這時(shí)用戶所寫的程序?qū)?huì)遇到很大的麻煩,要么就用舊版的函數(shù)庫,要么就改寫自己的程序-----都是不怎么好的做法。在 Unix 下有 C 語言經(jīng)驗(yàn)的朋友應(yīng)該對這所謂的“兼容性”深有體會(huì)----系統(tǒng)很無聊的包含了很多只為了兼容性考慮的數(shù)據(jù)類型、函數(shù),為了移植性,開發(fā)稍大一點(diǎn)的軟件就多了一些很無謂的“痛苦”。私有類型就是為這種情況產(chǎn)生的:在程序包外,對私有類型數(shù)據(jù)只能執(zhí)行 := 和 = 操作,如有其它操作也是程序包內(nèi)定義的。這樣的好處是私有類型不會(huì)被濫用,相關(guān)的子程序都是程序包創(chuàng)建者定義的,而不是用戶。考慮一下下面的賬號(hào)管理的例子,具體函數(shù)實(shí)現(xiàn)略,只是象征性的說明一下問題:

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 create(account:in out account;account_id :Positive) return Boolean; 
007    function cancel(account:in out account;account_id :Positive) return Boolean;
008    function balance(account: in out account) return Integer;
009 private 
010    type account is 
011    record
012        account_id : positive;
013        balance : integer;
014    end record;
015 My_Account:constant account := (78781, 122); 
016 end accounts;

    過程 withdraw 和 deposit 對帳號(hào)進(jìn)行取款和存款操作,create 和 cancle 對帳號(hào)進(jìn)行創(chuàng)建和注銷,balance 返回當(dāng)前賬號(hào)的存款額。實(shí)際應(yīng)用中為了提高效率,這種類型的函數(shù)庫很有可能需要隨時(shí)升級(jí),使用了私有類型,用戶層的麻煩少了不少。

    私有類型 account 先簡略地聲明為類型 private,它的具體聲明跟在保留字 private 后,接下去就跟普通數(shù)據(jù)類型聲明一樣。account 類型的數(shù)據(jù)可以在該程序包外包括在主程序中創(chuàng)建,但對它的操作只能是賦值、相等比較及該函數(shù)包定義的操作;在該程序包內(nèi),則能對私有類型進(jìn)行任意操作,就好像它不是私有類型一樣。在這個(gè)例子里,我們還創(chuàng)建了一個(gè) account 類型的常量 My_Account,注意它的聲明方式:先是不完全的聲明,再在private 部份給出完整聲明。不管怎樣,用戶只能通過函數(shù)說明知道有這么個(gè)私有類型,卻不能過多的使用它。

有限專用類型

    如果嫌私有類型的 := 和 = 這兩個(gè)默認(rèn)操作也多余,則使用有限專用類型。如聲明上例的account為有限專有類型:

type account is limited private;

    其它方面與私有類型一樣,只是聲明略有不同。對這種數(shù)據(jù)類型的操作只能由該程序包完全定義,沒有了其它默認(rèn)操作。

    有時(shí)類型定義中還會(huì)出現(xiàn)單獨(dú)的 limited,沒有 private,這表示該類型是限制類型,賦值等操作不能作用于該類型變量,但不是“私有”的。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)