北航研究生課程-程序語(yǔ)言設(shè)計(jì)原理教程-第08章_第1頁(yè)
北航研究生課程-程序語(yǔ)言設(shè)計(jì)原理教程-第08章_第2頁(yè)
北航研究生課程-程序語(yǔ)言設(shè)計(jì)原理教程-第08章_第3頁(yè)
北航研究生課程-程序語(yǔ)言設(shè)計(jì)原理教程-第08章_第4頁(yè)
北航研究生課程-程序語(yǔ)言設(shè)計(jì)原理教程-第08章_第5頁(yè)
已閱讀5頁(yè),還剩18頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、 第8章 抽象與封裝 函數(shù)和過(guò)程是封裝的程序?qū)嶓w,它有數(shù)據(jù)和操作,規(guī)格說(shuō)明(型構(gòu))和過(guò)程體,一體使于人們控制復(fù)雜性 Pascal統(tǒng)一的嵌套結(jié)構(gòu)不造于大型程序數(shù)據(jù)2sub1-sub10數(shù)據(jù)4sub22-sub28數(shù)據(jù)1sub11-sub15數(shù)據(jù)3sub16-sub21main續(xù) 將相關(guān)的數(shù)據(jù)和操作封裝成大模塊(若干類型,若干過(guò)程/函數(shù)) 結(jié)構(gòu)上形成包package或模塊 Modula包是可分別編譯。隨時(shí)連接軟件資源,是解決復(fù)雜系統(tǒng)的有力手段包的規(guī)格說(shuō)明和包體顯式分開(kāi)。語(yǔ)義上正好是“作什麼”,“怎麼做” 8.1 模塊和包 規(guī)格說(shuō)明和體在表示結(jié)構(gòu)上的分離。有利于修改,維護(hù) 封裝實(shí)現(xiàn)數(shù)據(jù)隱藏,有利于安

2、全 規(guī)格說(shuō)明是程序包的抽象,有利于復(fù)雜系統(tǒng)簡(jiǎn)化 模塊(包)封裝數(shù)據(jù)與操作,它有可控界面,外界不能操縱私有數(shù)據(jù)引出公有(public包的使用者可見(jiàn))、私有(private本包所有操作可訪問(wèn),包外不可見(jiàn))、保護(hù)(protected,包外不可見(jiàn),但本包的子包可見(jiàn))概念 包只是以封裝手段,可有/可沒(méi)有邏輯語(yǔ)義-只有數(shù)據(jù)無(wú)操作,數(shù)據(jù)塊BLOCK DATA(FORTRAN)-只有操作無(wú)共享數(shù)據(jù)如函數(shù)包,數(shù)學(xué)庫(kù)-有數(shù)據(jù)有操作,一口對(duì)外可模擬自動(dòng)機(jī)-有數(shù)據(jù)有操作,模擬客觀世界對(duì)象增加程序表達(dá)能力-封裝的包可實(shí)現(xiàn)復(fù)雜的數(shù)據(jù)類型ADT Ada 的復(fù)數(shù)程序包 package COMPLEX is type NUMB

3、ER is record REAL_PART:FLOAT; IMAG_PART:FLOAT; end record; function +(A,B: in NUMBER) return NUMBER; function -(A,B: in NUMBER) return NUMBER; function *(A,B: in NUMBER) return NUMBER; end COMPLEX; package body COMPLEX is endCOMPLEX; 有了這個(gè)程序包我們可以編出復(fù)數(shù)應(yīng)用程序: with COMPLEX; use COMPLEX; procedure MAIN is

4、COMP_1: NUMBER = (1.0,2.0);-1+2i COMP_2: NUMBER : =(3.0,4.0); - 3+4i W, X,Z: NUMBER; begin W = COMP_1 + COMP_2; -W = 4+6i X = COMP_2 - COMP_1; -X = 2+6i Z = COMP_1 * COMP_2; -Z = -5+10i end MAIN;8.2 抽象數(shù)據(jù)類型 數(shù)據(jù)抽象數(shù)據(jù)抽象是抽象數(shù)據(jù)類型的方法學(xué)定義一組數(shù)據(jù)集V,以及其上的操作集Op,構(gòu)成ADT(Abstract Data Type) T=( V , Op )-什么和怎么做分開(kāi)(規(guī)格說(shuō)明和體)

5、-實(shí)現(xiàn)數(shù)據(jù)隱藏(體中聲明的數(shù)據(jù)和操作外界不可見(jiàn))-分別開(kāi)發(fā)分別編譯(可做大程序)-簡(jiǎn)化復(fù)雜性便于調(diào)試(利用抽象實(shí)現(xiàn)分治)-構(gòu)造新類型,計(jì)算直觀方便(面向?qū)ο蟮幕A(chǔ))構(gòu)造新類型Swith COMPLEY use COMPLEY;Procedure MAIN is C1:NUMBER is =(1.0,2.0); C2:NUMBER is =(3.0,4.0); W ,X, Z :NUMBER;begin W:=C1+C2; X :=C2-C1; Z :=C1*C2;end MAIN-*+NumberLEXCOMP 構(gòu)造函數(shù)和析構(gòu)函數(shù)變量類型 V : integer;以類型指明程序?qū)ο笞兞砍橄髷?shù)據(jù)

6、類型, 聲明時(shí)要指明如何構(gòu)造C:NUMBER:=(1.0,2.0) 較簡(jiǎn)單可用賦初值辦法,復(fù)雜在運(yùn)行中由構(gòu)造函數(shù)(constructor)完成 C = ADT_Name() 構(gòu)造函數(shù)(constructor) 和ADT同名不再使用的程序?qū)ο?,用析?gòu)函數(shù)(destructor)顯式刪除一般形式是:ADT_Name() 和ADT同名 ADT_Name( ) C語(yǔ)言以文件實(shí)現(xiàn)抽象數(shù)據(jù)類型 C語(yǔ)言4種文件 -頭文件“modules.h” 定義宏和類型聲明 -主模塊“name.c” 給出新類型的數(shù)據(jù)和操作定義 -其它模塊“other.c” 實(shí)現(xiàn)頭文件中聲明 -通過(guò)makefile指明各文件關(guān)系 make

7、 SOMETYPE SOMETYPE:name.o other.o /連續(xù)兩模塊的目標(biāo)碼 文件取名SOMETYPE CC_o SOMETYPE name.o other.o /編譯并連成為 SOMETYPE的目標(biāo)文件 name.o : name.c modules.h /兩源文件連成為name.o CC_o name.o name.c /源文件編譯后形成目標(biāo)文件 other.o : other.c modules.h CC_o other.o other.c /SOMETYPE 如預(yù)定義的了8.3 類屬 函數(shù)是表達(dá)式集的抽象、過(guò)程是命令集的抽象,類屬(generic)是聲明集的抽象。 即聲明的

8、變量、類型、子程序都是參數(shù)化的。 Ada類屬子程序: generic type ELEMENT is pravite; -類屬類型參數(shù) procedure EXCHANGE (FIRST, SECOND:in out ELEMENT); TEMP:ELEMENT; -程序中用類屬形參 begin TEMP = FIRST; FIRST = SECOND; SECOND = FIRST; end EXCHANGE; 關(guān)鍵字procedure換成package即為類屬包 參數(shù)化類型與實(shí)際類型結(jié)合。由類屬設(shè)例指明:procedure INT_EXCHANGE is new EXCHANGE (Int

9、eger);實(shí)在的Integer與ELEMENT匹配, 即在procedure中任何出現(xiàn)ELEMENT的地方以Integer代,等于有了整數(shù)的 EXCHANGE 如同樣板,可以寫(xiě)出多個(gè)過(guò)程: procedure CHAR_EXCHANGE is new EXCHANGE ( Character); procedure SMALLINT_EXCHANGE is new EXCHANGE (MY_INT);8.3.1 類屬定義一般形式 generic | | | package GENERIC_PKG is -用類屬參數(shù)的包 . . . end GENERIC_PKG; 類屬實(shí)例化是在有了實(shí)在參數(shù)

10、以后作實(shí)例聲明: package INS_PKG is new GENERIC_PKG(); 類屬形實(shí)參數(shù)的個(gè)數(shù)、 次序要匹配。類屬參數(shù) 原則上聲明中的所有程序?qū)ο蠖伎梢詤?shù)化,其實(shí)現(xiàn)機(jī)制如同子程序中參數(shù)結(jié)合, 類屬值一般是復(fù)制機(jī)制, 類屬對(duì)象(變量)、類型、子程序用引用機(jī)制。 取決于實(shí)現(xiàn)。類屬聲明是 in 模式變量 可換值 inout模式變量 可換變量類屬類型private 私有 可以和任何類型匹配 () 枚舉 可以和任何枚舉類型匹配 range 整 可以和任何整型匹配 delta 定點(diǎn) 可以和任何定點(diǎn)類型匹配 digits 浮點(diǎn) 可以和任何浮點(diǎn)類型匹配類屬子程序with procedure

11、() 可以和任何過(guò)程匹配,同時(shí)類型參數(shù)例化 Ada的類屬程序包的例子 程序包中封裝一分類和歸并程序。被分?jǐn)?shù)據(jù)按數(shù)組類型設(shè)計(jì),它的元素類型,按升序還是降序,數(shù)組下標(biāo),都參數(shù)化: generic type ITEM is private -數(shù)組元素類型參數(shù)化 type SEQUENCE is array (Integer range ) of ITEM; -數(shù)組類型參數(shù)化。ITEM馬上就用了 with function PRECEDES (x,y:ITEM ) return Boolean; -參數(shù)化操作未定升降序 package SORTING is procedure SORT (S: in

12、SEQUENCE); procedure MERGE (S1, S2: in SEQUENCE; S: out SEQUENCE); end SORTING;有兩個(gè)實(shí)在函數(shù): function = (X,Y: Float) return Boolean; 那么就可以作以下設(shè)例聲明: type FLPAT_SEQUENCE is array (Integer range ) of Float; package ASCENDING is new SORTING(Float,F(xiàn)LOAT_SEQUENCE,=); 這樣, 就有了一個(gè)升序, 一個(gè)降序的兩個(gè)程序包。續(xù)類屬動(dòng)態(tài)實(shí)現(xiàn)問(wèn)題類屬程序是抽象程序可以

13、編譯,但不可執(zhí)行,每次執(zhí)行的是實(shí)例程序。其編譯執(zhí)行如同C語(yǔ)言之宏替換,也就是參數(shù)靜態(tài)束定于實(shí)參,強(qiáng)類型語(yǔ)言可以做到。類屬程序只有一個(gè),運(yùn)行時(shí)動(dòng)態(tài)束定就不需要顯式設(shè)例。 因此,動(dòng)態(tài)設(shè)例的程序表達(dá)能力更強(qiáng),程序易于擴(kuò)充。8.4 類和對(duì)象包充作程序?qū)ο體ith SYSTEM; package STACK is function PUSH (k:Integer) return Boolean; function POP return Integer; function TOP return Integer;-返回棧頂元素end STACK; package body STACK is STKLEN :

14、 constant:=10; -堆棧有十元素 STK:array (1.STKLEN) of Integer; -整數(shù)堆棧體 TOS: Integer range 1.STKLEN; function PUSH (k:Integer) is begin if TOS 0 then return STK(TOS); else return SYSTEM.MIN_INT; -交SYSTEM包處理 endif; end TOPfunction POP return Integer is ANS:Integer; -工作變量局部量 begin ANS:= TOS; TOS:= TOS - 1; ret

15、urn ANS; end POP;begin -程序包是資源,以下執(zhí)行代碼在裝入后, TOS:=0 -程序運(yùn)行時(shí)首先執(zhí)行,為了初始化。end STACK; 這個(gè)對(duì)象是實(shí)例對(duì)象,可以對(duì)它施行堆棧操作 stack.PUSH(N); stack.pop; stack.top;包名充作實(shí)例對(duì)象名。類對(duì)象生成實(shí)例對(duì)象 C+的類定義 class char_stack /以下是該類的私有部分 int size; char * tos, *end; char * s; public: /以下是該類公共部分 char_stack(int sz) s = new char size = sz; tos = s;

16、end = tos + (size - 1); char_stack( ) delete s; int push (char c) return (tos s ? * - tos:); char top( ); /top的聲明 ; /類定義結(jié)束 char char_stack:top( ) /top的定義 return (tos s ? * tos : ); 相應(yīng)主程序main( ) char c; char_stack stk1(100);/構(gòu)造子,形同類型說(shuō)明 char_stack stk2(10); stk3 = new char_stack (20); stk1.push ( #); /向Stk1發(fā)push消息 stk2.push (%); c = stk2.pop( ); 續(xù) .類、類型、抽象數(shù)據(jù)類型 同異-都是(A,Op)值集和值上的操作集,在這個(gè)意義上, 它們通用 C+ 按此處理-類型和抽象數(shù)據(jù)類型都是類型。如同人和黑人 都是人,類型沿用歷史理解是基元類型+簡(jiǎn)單結(jié)構(gòu)類型 (預(yù)定義)抽象數(shù)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論