研究生課程程序語言設計原理教程第08章_第1頁
研究生課程程序語言設計原理教程第08章_第2頁
研究生課程程序語言設計原理教程第08章_第3頁
研究生課程程序語言設計原理教程第08章_第4頁
研究生課程程序語言設計原理教程第08章_第5頁
已閱讀5頁,還剩18頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、 第第8 8章章 抽象與封裝抽象與封裝 函數(shù)和過程是封裝的程序實體,它有數(shù)據(jù)和操作,規(guī)格說明(型構)和過程體,一體使于人們控制復雜性 pascal統(tǒng)一的嵌套結構不造于大型程序main代 碼sub2數(shù) 據(jù) 代 碼sub1數(shù) 據(jù) 代 碼main數(shù)據(jù)main數(shù)據(jù)mainsub110sub1115sub1621sub22284321小程序結構小程序結構大程序結構大程序結構數(shù)據(jù)2sub1-sub10數(shù)據(jù)4sub22-sub28數(shù)據(jù)1sub11-sub15數(shù)據(jù)3sub16-sub21main續(xù) 將相關的數(shù)據(jù)和操作封裝成大模塊(若干類型,若干過程/函數(shù)) 結構上形成包package或模塊 modula包是可

2、分別編譯。隨時連接軟件資源,是解決復雜系統(tǒng)的有力手段包的規(guī)格說明和包體顯式分開。語義上正好是“作什麼”,“怎麼做”數(shù)據(jù)對象和類型子程序規(guī)格(操作)(操作)私有數(shù)據(jù)子程序體子程序體子程序體私有操作程序包體規(guī)格說明外界可見 8.1 模塊和包 規(guī)格說明和體在表示結構上的分離。有利于修改,維護 封裝實現(xiàn)數(shù)據(jù)隱藏,有利于安全 規(guī)格說明是程序包的抽象,有利于復雜系統(tǒng)簡化 模塊模塊(包包)封裝數(shù)據(jù)與操作,它有可控界面,外界不封裝數(shù)據(jù)與操作,它有可控界面,外界不能操縱私有數(shù)據(jù)引出公有能操縱私有數(shù)據(jù)引出公有(publicpublic包的使用者可見)包的使用者可見)、私、私有有(privateprivate本包所

3、有操作可訪問,包外不可見)本包所有操作可訪問,包外不可見)、保護、保護(protected,protected,包外不可見,但本包的子包可見)包外不可見,但本包的子包可見)概念概念 包只是包只是以封裝手段以封裝手段, ,可可有有/ /可沒有可沒有邏輯邏輯語語義義-只有數(shù)據(jù)無操作,數(shù)據(jù)塊只有數(shù)據(jù)無操作,數(shù)據(jù)塊block datablock data(fortranfortran)-只有操作無共享數(shù)據(jù)如函數(shù)包,數(shù)學庫只有操作無共享數(shù)據(jù)如函數(shù)包,數(shù)學庫-有數(shù)據(jù)有操作有數(shù)據(jù)有操作,一口對外可模擬自動機一口對外可模擬自動機-有數(shù)據(jù)有操作有數(shù)據(jù)有操作,模擬客觀世界對象模擬客觀世界對象增加程序表達能力增加程

4、序表達能力-封裝的包可實現(xiàn)復雜的數(shù)據(jù)類型封裝的包可實現(xiàn)復雜的數(shù)據(jù)類型adtadt ada 的復數(shù)程序包 package complex is type number 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 i

5、s endcomplex; 有了這個程序包我們可以編出復數(shù)應用程序: with complex; use complex; procedure main is 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 8.2 抽象數(shù)據(jù)類型抽象數(shù)據(jù)類型 數(shù)據(jù)抽象

6、數(shù)據(jù)抽象數(shù)據(jù)抽象是抽象數(shù)據(jù)類型的方法學數(shù)據(jù)抽象是抽象數(shù)據(jù)類型的方法學定義一組數(shù)據(jù)集定義一組數(shù)據(jù)集v v,以及其上的操作集以及其上的操作集opop,構成構成adtadt(a abstract data type) t=( v , op )t=( v , op )-什么和怎么做分開什么和怎么做分開(規(guī)格說明和體規(guī)格說明和體)-實現(xiàn)數(shù)據(jù)隱藏(體中聲明的數(shù)據(jù)和操作外界不可見)實現(xiàn)數(shù)據(jù)隱藏(體中聲明的數(shù)據(jù)和操作外界不可見)-分別開發(fā)分別編譯(可做大程序)分別開發(fā)分別編譯(可做大程序)-簡化復雜性便于調(diào)試(利用抽象實現(xiàn)分治)簡化復雜性便于調(diào)試(利用抽象實現(xiàn)分治)-構造新類型,計算直觀方便(面向對象的基礎)

7、構造新類型,計算直觀方便(面向對象的基礎)構造新類型構造新類型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 構造函數(shù)和析構函數(shù)變量類型 v : integer;以類型指明程序對象變量抽象數(shù)據(jù)類型, 聲明時要指明如何構造c:number:=(1.0,2.0) 較簡單可用賦初值辦法,復雜在運行中由構造函數(shù)

8、(constructor)完成 c = adt_name() 構造函數(shù)(constructor) 和adt同名不再使用的程序對象,用析構函數(shù)(destructor)顯式刪除一般形式是:adt_name() 和adt同名 adt_name( ) c c語言以文件實現(xiàn)抽象數(shù)據(jù)類型語言以文件實現(xiàn)抽象數(shù)據(jù)類型 c c語言語言4 4種文件種文件 -頭文件頭文件“modules.h” modules.h” 定義宏和類型聲明定義宏和類型聲明 -主模塊主模塊“name.c” name.c” 給出新類型的數(shù)據(jù)和操作定義給出新類型的數(shù)據(jù)和操作定義 -其它模塊其它模塊“other.c” other.c” 實現(xiàn)頭文件

9、中聲明實現(xiàn)頭文件中聲明 -通過通過makefilemakefile指明各文件關系指明各文件關系 make sometypemake sometype sometype sometype:name.o other.o /name.o other.o /連續(xù)兩模塊的目標碼連續(xù)兩模塊的目標碼 文件取名文件取名sometypesometype cc_o sometype name.o other.o / cc_o sometype name.o other.o /編譯并連成為編譯并連成為 sometypesometype的目標文件的目標文件 name.o : name.c modules.h /nam

10、e.o : name.c modules.h /兩源文件連成為兩源文件連成為name.oname.o cc_o name.o name.c / cc_o name.o name.c /源文件編譯后形成目標文件源文件編譯后形成目標文件 other.o : other.c modules.hother.o : other.c modules.h cc_o other.o other.c /sometype cc_o other.o other.c /sometype 如預定義的了如預定義的了8.3 8.3 類屬類屬 函數(shù)是表達式集的抽象、過程是命令集的抽象,類屬(generic)是聲明集的抽象。

11、即聲明的變量、類型、子程序都是參數(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; 關鍵字procedure換成package即為類屬包 參數(shù)化類型與實際類型結合。由類屬設例指明:procedure int_exchange is new exchange

12、(integer);實在的integer與element匹配, 即在procedure中任何出現(xiàn)element的地方以integer代,等于有了整數(shù)的 exchange 如同樣板,可以寫出多個過程: procedure char_exchange is new exchange ( character); procedure smallint_exchange is new exchange (my_int);8.3.1 8.3.1 類屬定義一般形式類屬定義一般形式 generic | | | package generic_pkg is -用類屬參數(shù)的包 . . . end generic_

13、pkg; 類屬實例化是在有了實在參數(shù)以后作實例聲明: package ins_pkg is new generic_pkg(); 類屬形實參數(shù)的個數(shù)、 次序要匹配。類屬參數(shù)類屬參數(shù) 原則上聲明中的所有程序對象都可以參數(shù)化,其實現(xiàn)機原則上聲明中的所有程序對象都可以參數(shù)化,其實現(xiàn)機制如同子程序中參數(shù)結合,制如同子程序中參數(shù)結合, 類屬值一般是復制機制,類屬值一般是復制機制, 類屬類屬對象對象( (變量變量) )、類型、子程序用引用機制。、類型、子程序用引用機制。 取決于實現(xiàn)。取決于實現(xiàn)。類屬聲明是類屬聲明是 in in 模式模式變量變量 可換值可換值 inoutinout模式模式變量變量 可換變量

14、可換變量類屬類型類屬類型private private 私有私有 可以和任何類型匹配可以和任何類型匹配 () () 枚舉枚舉 可以和任何枚舉類型匹配可以和任何枚舉類型匹配 range range 整整 可以和任何整型匹配可以和任何整型匹配 delta delta 定點定點 可以和任何定點類型匹配可以和任何定點類型匹配 digits digits 浮點浮點 可以和任何浮點類型匹配可以和任何浮點類型匹配類屬子程序類屬子程序with procedure(with procedure() 可以和任何過程匹配,同時類型參數(shù)例化可以和任何過程匹配,同時類型參數(shù)例化 ada的類屬程序包的例子 程序包中封裝一

15、分類和歸并程序。被分數(shù)據(jù)按數(shù)組類型設計,它的元素類型,按升序還是降序,數(shù)組下標,都參數(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 sequence); procedure merge (s1, s2: in seq

16、uence; s: out sequence); end sorting;有兩個實在函數(shù): function = (x,y: float) return boolean; 那么就可以作以下設例聲明: type flpat_sequence is array (integer range ) of float; package ascending is new sorting(float,float_sequence,=); 這樣, 就有了一個升序, 一個降序的兩個程序包。續(xù)類屬類屬動態(tài)實現(xiàn)問題動態(tài)實現(xiàn)問題類屬程序是抽象程序可以編譯,但不可執(zhí)行,類屬程序是抽象程序可以編譯,但不可執(zhí)行,每次執(zhí)行的

17、是實例程序每次執(zhí)行的是實例程序。其編譯執(zhí)行如同其編譯執(zhí)行如同c c語言語言之宏替換,也就是參數(shù)靜態(tài)束定于實參,強類之宏替換,也就是參數(shù)靜態(tài)束定于實參,強類型語言可以做到。型語言可以做到。類屬程序只有一個類屬程序只有一個,運行時動態(tài)束定就不需要運行時動態(tài)束定就不需要顯式顯式設例設例。 因此因此,動態(tài)設例的程序表達能力更動態(tài)設例的程序表達能力更強強,程序易于擴充。,程序易于擴充。8.4 8.4 類和對象類和對象包充作程序對象包充作程序對象with systemwith system; package stack is package stack is function push (k:intege

18、r) return boolean function push (k:integer) return boolean; function pop return integer function pop return integer; function top return integer function top return integer;-返回棧頂元素返回棧頂元素end stackend stack; package body stack is package body stack is stklen : constant:=10 stklen : constant:=10; - -堆棧

19、有十元素堆棧有十元素 stk:array (1.stklen) of integerstk:array (1.stklen) of integer; - -整數(shù)堆棧體整數(shù)堆棧體 tos: integer range 1.stklentos: integer range 1.stklen; function push (k:integer) is function push (k:integer) is begin begin if tos stklen then if tos 0 then if tos 0 then return stk(tos) return stk(tos); else

20、else return system.min_int return system.min_int; - -交交systemsystem包處理包處理 endifendif; end top end topfunction pop return integer is function pop return integer is ans:integer ans:integer; - -工作變量局部量工作變量局部量 beginbegin ans:= tos ans:= tos; tos:= tos - 1 tos:= tos - 1; return ans return ans; end pop en

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

溫馨提示

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

評論

0/150

提交評論