北航研究生課程程序語言設計原理教程第10章.ppt
《北航研究生課程程序語言設計原理教程第10章.ppt》由會員分享,可在線閱讀,更多相關《北航研究生課程程序語言設計原理教程第10章.ppt(60頁珍藏版)》請在裝配圖網上搜索。
第10章面向對象程序設計語言 當今席卷軟件界的面向對象技術 近因是xerox公司1980年推出的Smalltalk 80語言 10 1Smalltalk語言對象的思想最早源于人工智能研究 60年代末描述智能對象的框架 frame 即封裝了許多槽 slot 槽既可以是屬性 數(shù)據(jù) 也可以是行為 操作 和 約束 但最早見諸文獻是sketchpad提到的OO圖形學 1963 60年代挪威的Dahl和Nyard為模擬系統(tǒng)研制了SIMULA 67語言 首先提出封裝的類和動態(tài)生成實例對象的概念 60年代末 美國猶他大學AlanKay到Xerox公司PaloAlto研究中心參加了Dynabook項目 該項目的硬件是Star 個人機的前驅 軟件是Smalltalk 1972年DanIngalls完成Smalltalk 72第一個實用版 以后又經過 76 80兩次改進 Smalltalk 80成為向外發(fā)行的正式版本 10 1 1Smalltalk系統(tǒng) 語言核心 Kernel 程序設計系統(tǒng) 程序設計范型 Paradigm 用戶界面模型 UserInterfaceModel 10 1 2用戶界面模型 系統(tǒng)工作空間 SystemWorkSpace 工作空間 WorkSpace 系統(tǒng)副本 SystemTranscript 項目 Project 兩種圖形編輯窗 Form和Bit 系統(tǒng)瀏覽器 SystemBrowser 窗 用戶就是按瀏覽窗中顯示的模板填寫程序 10 1 3語言核心 1 保留字只有五個nil true false self super 2 字面量字符字面量 數(shù)字面量 符號字面量 數(shù)組字面量 3 限定符和特殊符號 或 4 變量實例變量 類變量 臨時變量 全局變量 匯聚變量 參數(shù) 5 消息表達式與語句 消息表達式的一般格式是 對象選擇子參數(shù)Smalltalk的消息表達式有三種 單目的不帶參數(shù)treeclass消息class發(fā)向tree 得到tree的類 0 3sin消息sin發(fā)向0 3 得sin 0 3 Arraynew消息new發(fā)向Array 創(chuàng)建 Array的實例 對象 選擇子 參數(shù) 雙目的3 4消息 帶參數(shù)4發(fā)向對象3 得對象7 100 50消息 帶參數(shù)50發(fā)向對象100 得 100 50 sum count reserveamount雙目 括號優(yōu)先單目優(yōu)先雙目 關鍵字消息表達式用關鍵字 帶有 的選擇子 描述的雙目表達式 也是自左至右釋義 anArrayat 3put 100financestotalSpentOn food 賦值變量在不同時間可賦以不同對象 任何表達式加上賦值前綴 quantity 19 name chapter1 foo arrayat 4 數(shù)組第4元素與 foo 同名 塊表達式 x y BicPengoto x y x y BicPengoto x y value 100value 250BicPengoto100 250 aBlock aBlock ThisisaString displayAt 500 500 Displaywhite aBlockvalue 6 控制結構條件選擇一般形式是 布爾子表達式ifTrue 真 塊執(zhí)行 ifFalse 假 塊執(zhí)行 可以不出現(xiàn) 如 numberlistSize whileFalse listat indexput 0 index index 1 7 消息 方法消息模式 臨時變量 語句組nawAt initialLocation newBox newBox selfnew newBoxsetLoc initiaPLocationtilt 0size 100scribe pennew newBoxshow setLoc newLoctilt newTiltsize newSizeseribe newScribe Loc newLoc titl newTilt size newSize scribe newScribe Smalltalk是編譯 解釋執(zhí)行的 Smalltalk源程序經編譯器得到虛映象 Virtualimage 虛映象由字節(jié)代碼中間語言編寫 由Smalltalk虛機解釋執(zhí)行 相應的文件系統(tǒng)管理三種文件 源文件 變更文件 映象文件 由于Smalltalk是交互式的 被編譯的方法在執(zhí)行期間出了問題要反應到源程序 則要對映象文件施行反編譯 decompliation Smalltalk的虛機是一個新軟件 它有三個功能部分 存儲管理器 虛映象解釋器 基本例程用匯編碼寫出的底層方法實現(xiàn) 10 1 4Smalltalk文件系統(tǒng)與虛機 10 1 5Smalltalk程序設計范型 程序設計在類的層次上進行 由類靜態(tài) 于工作空間指明向類發(fā)出消息 或動態(tài) 方法運行時 生成實例對象 每個對象當接受某消息并執(zhí)行其方法的消息表達式時都是在自向其它對象發(fā)消息 10 1 5 1一個簡單的Smalltalk程序 統(tǒng)計字母出現(xiàn)頻率 sf 定義了兩個臨時變量 s Prompterprompt enterline default s是Prompter的實例 將關鍵字表達式的結果束定于s 意即輸入一行字符串 若不輸入 S為空串 f Bagnew f是Bag的實例 sdo c cisLetterifTure fadd casLowerCase s在Prompter中找方法do 的模式 若找不到 找prompter的 父類直到Object C是塊變量 意從S中拿出某字符 isLetter 是消息模式 判C是否字符 若為真執(zhí)行內塊 內塊中f找add 消息模式 從Bag直至上層父類 找到先執(zhí) 行右邊子表達式 casLowerCase是單目表達式 同樣要在Prompter中找asLowerCase匹配 也是不成向上找 它返回是 第k個 小寫字母 add 把它發(fā)送到對象f的第k個位置上并與原數(shù)相加 f 返回f中的值 這個程序一共四句 如果掀鼠標使菜單項 doit 工作并輸入 SmalltalkisaprogrammingLanguagefordevelopingsoluionstobothsimpleandcomplexproblem 則輸出的f值是 71124151517447336321abcdefghiklmnoprstuv 例字頻統(tǒng)計對比程序PascalSmalltalkPROGRAMFrequency 無消息模式方法 宜寫算法 CONSTSize 80 VARs string size scfk k i Integer 定義了四個臨時變量 c Char f ARRAY 1 26 OFInteger f Arraynew 26 BEGIN f是Arrey實例長度26 Writeln enterline s PrompterReadIn s prompt enterline FORi 1TO26DOdefault f i 0 S是Prompter的實例 裝輸入字串 FORi 1TosizeDO1to 26do I fat Iput 0 BEGIN1to sizedo I c aslowerCase s i c sat i asLowerCase ifisLetter c THENcisLetterifTrue BEGINk casciiValuek ord c ord a 1 aasciiValue 1 f k f k 1fat kput fat k 1END END FORi 1To26DO fWrite f i END 10 1 5 2類協(xié)議 10 1 5 3一個完整的Smalltalk程序 家庭財務帳目建立全部流水帳類 直接掛在Object上classnameFinancialHistorysuperclassObjectinstancevariablenames caseOnHandincomesexpenditures category FinancialTools classmethodinitialBalance amount 建立流水帳本初始為amount 元 supernewsetinitialBalance amounTnew 建立流水帳本初始為0 元 supernewsetinitialBalance 0instancemethodreceive amountfrom source incomesat sourceput lselftotalReceivedFrom source amount 從來源source接收到的錢數(shù) 因而手頭現(xiàn)金增加 cashOnHand cashOnHand amount incomeschangedspend amountfor reason 為事由reason支付的錢數(shù) 因而手頭現(xiàn)金減少 expendituresat reasonput selftotalSpentFor reason amount cashOnHand cashOnHand amount expenditureschangedCashOnHand 回答當前手頭現(xiàn)金 cashOnHandexpenditures 回答支出細目 expendituresincomes 回答收入細目 incomestotalReceiveFrom source 回答自source收錢總數(shù) incomesincludesKey source ifTrue incomesat source ifFalse 0 totalSpentFor reason 回答在reason項上總支出 expendituresincludesKey reason ifTrue expendituresat reason ifFalse 0 privateSetlnitialBalance amount 實例變量初始化 cashOnHand amount incomes Dictionarynew expenditures Dictionarynew Smalltalkat HouseholdFinancesput nil HouseholdFinances FinancealHistoryinitialBalance 1560HouseholdFinancesspend 700for rent NouseholdFinancesspend 78 53for food HouseholdFinancesreceive 820from pay HouseholdFinancesreceive 22 15from interest HouseholdFinancesspend 135 65for utilities HouseholdFinancesspend 146 14for food 10 1 6Smalltalk程序設計系統(tǒng) 在Smalltalk中 系統(tǒng)支持程序也是作為類掛在Object之下 包括算術運算 數(shù)據(jù)和控制結構的實現(xiàn) 輸入 出 隨機數(shù)生成器等 有一些類是輔助程序設計過程的 語法分析器 編譯器 解釋器 反編譯器這些對象的方法都有源代碼 目標碼兩種形式 還有一些對象表示類和方法的結構 以便程序員追蹤系統(tǒng) 還有將方法和向其發(fā)消息的對象聯(lián)結起來的對象 這些對象統(tǒng)稱環(huán)境 contexts 類似其他語言實現(xiàn)中的堆棧幀和活動記錄 10 2Smalltalk的對象 類 方法的實現(xiàn)類的存儲 實例對象的存儲實例對象只存放數(shù)據(jù) 其存儲格式如下圖 活動記錄 環(huán)境部分 指令部分 發(fā)送者部分 10 3面對象的基本特征 P Wegner總結了OO語言的發(fā)展 給出以下圖示澄清了概念 封裝 對象 數(shù)據(jù)和操作 局部性 可維護性抽象 類概括描述 簡單性繼承 類體系可重用性多態(tài) 重載 類屬可擴充性動態(tài)束定 面向對象可交互性基于對象的語言基于類的語言面向對象語言Ada83 ActorCLUSmalltalk Eiffelsimula67C Ada95 Java 傳統(tǒng)老語言紛紛轉向OO 這里面分三種情況 以老語言模擬Smalltalk 下層則可利用老語言的資源 代表是Objective C 改造老語言 在原有風格基礎上增加對象 類機制 盡可能全面反映上述五大特征 代表是C Ada95以及ObjectCOBOL ObjectPaseal ObjectFORTH 這是多范型語言之路 按上述五大特征設計全部的強類型面向對象語言 典型的是Eiffel 它雖然純正 但脫離了原有環(huán)境資源支持 推廣需要時日 封裝與繼承帶來的問題 訪問權限C 類繼承方式子類公有Public公有公有Private私有保護Public私有 仍受保護 保護Private不繼承私有Public不繼承私有Private不繼承 對象初始化次序derived derived inti intj intk basel i base2 j d k 第一基類構造函數(shù) 第二基類構造函數(shù)缺省構造函數(shù)是先基后派對缺省的析構子其調用次序相反 先派后基 強類型語言的動態(tài)多態(tài)問題C 的無法執(zhí)行的多態(tài)函數(shù)設父類ellipse子類eircle均有求周長求面積area 函數(shù) 有以下主程序 main ellipse pe e 8 0 4 0 eirclec 5 0 pe 實現(xiàn)辦法是建立一個虛函數(shù)表記下本函數(shù)在各子類中的位移 當pe代表不同子類對象時 可以準確找到要計算的函數(shù) 計算并打印職工工資表設經理 專業(yè)人員 行政人員領年薪 其它雇員領計時工資 其類繼承體系是 若前此已設計card pay data類 部分程序是 classemployee charname soc sec 13 dept code job codepublic employee Link employee int 構造函數(shù) 變元是名字個數(shù)voidprint paycheck virtualpay datacompute pay virtualvoidprint list voidemployee print empl cout Name name n t soc sec tDept dept code tJob job code n classsalaried publicemployee intannual salary vocation used public pay datacomput pay voidtake vacation classmanager salaried employee staff public voidadd employee voidprint list voiddo payroll manager 構造函數(shù) classhourly publicemployee floatpay rate hours worked overtime intvacation used public pay datacompute pay voidrecord time card card hourly 構造函數(shù) classofficer salaried classprofessional salaried 其中employee print list 定義為虛函數(shù) manager print list 也是虛函數(shù) 它們的各自定義是 voidemployee print list employee scan for scan link scan NULL scan scan link voidmanager print list cout n nManager print empl cout nEmployeesSupervised n employee print list 10 4Ada的面向對象機制 定義類和實例對象Ada95以抽象數(shù)據(jù)類型實現(xiàn)類 類的封裝性由包實現(xiàn) 類的繼承性則擴充了標簽 tag 類型和抽象類型 標簽類型只限記錄類型 類的繼承性利用了Ada8的類型派生機制實現(xiàn)子類 packageObjectistypeObjectistagged 此類型的數(shù)據(jù)即對象的屬性record 無tagged即一般的ADT 有它是為了類繼承X Coord Float 0 Y Coord Float 0 初值為缺省時用endrecord functionDistance O Object returnFloat Object對象的行為functionArea O Object returnFloat endObject withObject useObject packageShapesis 這個包封裝了三個子類 型 typePointisnewObjectwithnullrecord 只繼承不擴充的子類typeCircleisnewObjectwith 繼承并擴充此屬性recordRadius Float endrecord functionArea C Circle returnFloat 覆蓋Object中的AreatypeTriangleisnewObjectwith 繼承并recordA B C Float 擴充三個屬性endrecord functionArea T Triangle returnFloat 覆蓋endShape 這些類 型 包外可見 可輸出 在主子程序中聲明實例 如同類型聲明變量 以初值表達式作值構造子 子類的實例也是父類的實例O Object P Point 聲明實例對象P Owithnullrecord C Cirele 0 0 0 0 34 7 C Owith34 7 T Triangle 3 0 4 0 5 0 T Owith3 0 4 0 5 0 如果動態(tài)生成實例 可將此聲明放在類的方法 過程 函數(shù) 中 調用時生成 以類寬類型實現(xiàn)多態(tài) Ada95的每個標簽類型都有一個與之對應的類類型屬性T Class 并把它叫做類寬類型 ClassWideType 設已聲明T類型 及T Class的變量V 則Y T 一般聲明 正確Y T Class 不可以Y T Class V 可以 T Class束定為V的類型類寬類型的范圍示意如下 procedureProcess Reservation Rc inoutReservation Class is 形參可以是類寬類型 不必最初束定某特定類型begin Make Rc 它按相結合的Rc的具體類型出票 endProcess Reservation 這個程序在編譯時Make是沒有也無法束定到某make函數(shù)體上 只有在運行中 動態(tài) 束定 束定時按Rc對應的實參的標簽tag值派送 編譯時只要做出派送表 擴充程序包機制實現(xiàn)繼承的類體系 Ada95增設了子輩單元 childunit 和私有子輩單元 子輩單元packageReservation System Supersonicis 后是子輩單元名typeSupersonic ReservationisnewReservationwithprivate privatetypeSupersonic ReservationisnewReservationwithrecordChampagne Vintage endrecord procedureMake Sr inoutSupersonic Reservation procedureSelect Seat Sr inoutSupersonic Reservation endReservation System Supersonic 私有子輩單元packageOSis 父包OS OS的可見成份typeFile Descriptorisprivate privatetypeFile DescriptorisnewInteger endOS packageOS Exceptionsis OS的子輩程序包File Descriptor Error File Name Error Permission Error exception 所定義異常OS各子輩包均可用endOS Exceptions 公有 但不涉及泄露withOS Exceptions withOS Exceptions packageOS File Manageris OS的子輩程序包typeFile Modeis Read Only Write Only Read Write functionOpen File Name String Mode File Mode returnFile Descriptor procedureClose File inFile Descriptor endOS File Manager 公有 只用私有類型 也無泄露withOS Exceptions procedureOS Interpret Command String 命令解釋過程 等同子包privatepackageOS Internalsis 私有子輩程序包 不用with endOS Internals privatepackageOS Internals Debugis OS的私有子輩程序包 endOS Internals Debug Ada的多繼承withAbstract Sets packageLinked SetsistypeLinked SetisnewAbstruct Setswithprivate 再定義Linked Set的各種操作privatetypeCell typeCell PtrisaccessCell typeCellisrecordE Element next Cell Ptr endrecordfunctionCopy P Cell Ptr returnCell Ptr typelnnerisnewControlledwithrecordThe Set Cell Ptr endrecord procedureAdjuse Obj inoutlnner typeLinked SetisnewAbstract Setswith 繼承Abstraet setsrecordComponent lnner 其擴展成分又繼承了Controlledendrecord endLinked Sets 10 5Eiffel的對象 Eiffel有傳統(tǒng)語言的賦值 變量 控制 三種 函數(shù) 過程 調用 參數(shù)匹配 類屬 異常等概念和機制 它在這些概念與機制之上定義類和對象 Eiffel把類和類型同等看待 類是抽象數(shù)據(jù)類型的實現(xiàn)類型分為兩種 一為盡頭 expended 類型 這就是其它語言中的基元類型 引用 referance 類型 有了類型就可以聲明實體 entity P PERSON 實體P引用PERSON類 型 Eiffel中的實例對象沒有名字 但可借助實體 并可在執(zhí)行中生成 P雙驚嘆號即創(chuàng)建指令 創(chuàng)建一PERSON類的實例對象 I INTEGER 實體I就是盡頭類型INTEGER的實例不用雙驚嘆號 就是實例對象聲明 抽象數(shù)據(jù)類型nameQUEUE I includeLISTSsortI Q B NsignatureCREATEQ N QFRONTOFQ Q IADDTOQ Q I QREMOVEFROMQ Q QISEMPTYQ Q BISFULLQ Q BLENGTHOFQ Q Nsementicsleti I q r Q n N b B pre conditionsCREATEQ n n 0ADDTOQ q i notISFULL q 括號中逗號表示分開的輸入FRONTOFQ q notISEMPTY q REMOVEFROMQ q notISEMPTY q ISEMPTYQ q trueISFULLQ q tueLENGTHOFQ q true post conditionsCREATEQ n r r CREATELIST n 括號中的分號表示前面是輸入 后面是輸出參數(shù)ADDTOQ q i r r APPEND q i FRONTOFQ q i i HEAD q REMOVEFROMQ q r r TAIL q ISEMPTYQ q b b ISEMPTYLIST q ISFULLQ q b b ISFULLLIST q LENGTHOFQ q n n LENGTH q end Eiffel的類和程序運行 classQUEUE ITEM inheritOBJECT 可以多個父類 3 creationmake 只指明構造特征的名字 5 feature NONE 私有特征size INTEGERhead NODE ITEM 引用QUEUE類外的類型NODE 8 tail NODE ITEM 9 feature AN 公有特征 10 make n INTEGER is 構造n結點實例對象 只記 n和當前長度dosize nlength 0 當前長度為0 14 end make 15 front ITEMis 取隊前端數(shù)據(jù)項require 前置條件關鍵字notis empty 隊不空doResult head item 20 end front 21 add i ITEM is 在隊尾處加一項require 23 notis full 24 localnew node NODE ITEM do 27 New node make i 28 ifhead Voidthenhead new nodeelsetail Change next new node endtail new nodelength length 1 35 endsure 后置條件關鍵字tail new nodelength Old length 1 39 end add 40 removeis 取消隊頭項 結點 requirenotis emptydohead head nextifhead Voidthentail headendlength lenght 1ensure 后置條件end remove 52 is empty BOOLEANis 查隊是否空doResult length 0 end is empty 56 is full BOOLEANis 查隊是否滿doResalt length size end is full 60 length INTEGERend classQUEUE q QUEUEs STRING 63 q make 10 64 fromj 0 循環(huán)初值untilj 10 循環(huán)終值 68 loopj j 1io read lines io last lines io last line 72 q add s 73 end 查找數(shù)組a 索引從1到size 中 v值第一次出現(xiàn)的位置 fromposition 0s a item 1 invariant 不變式0 positionandposition sizevariant 變式size positionuntilposition sizeorelsev a item position loopposition position 1end Eiffel的繼承與多態(tài) 被繼承特征可換名 被繼承特征可改變可見性 被繼承特征可重新定義行為 可以使被繼承特征的行為延遲發(fā)生作用 選擇繼承 被繼承特征不作定義 classHEIRinheritPARENT1 無適配子句全部繼承此父類特征PARENT2renamef1asparent2 f1 將PARENT2中的f1換成后者f2asparent2 f2export 改變輸出 外部可見 狀態(tài) ANY f3 parent2 f1 PARENT2中f3 f1在此類中公有 NONE f4 parent2 f2 PARENT2中f4 f2在此類中私有 ACLASS f5 只許ACLASS使用redefine 內容有了修改的關鍵字parent2 f1 f3undefine 被覆蓋的關鍵字f4 parent2 f2 select 在同名特征中先定繼承路徑end 繼承來的PARENT2使用5種適配子句PARENT3renameg1asparent3 g1end 只選一種適配子句表示有了修改creation 本類構造子feature 本類定義的特征end classHEIR 指定動態(tài)類型和動態(tài)束定 指定動態(tài)類型P PERSON EMPLOYEE p make p的靜態(tài)類型仍然是PERSON 用它創(chuàng)了一個EMPLOYEE類型的對象 運行中執(zhí)行的是 e EMPLOYEE e MAKE 兩個make是不同的特征 動態(tài)束定Eiffel中可以寫指令 plist item display其中display在各子類 型 中定義同名 但例程不一樣 執(zhí)行時可按item當前類 型 找出它的display特征執(zhí)行 即動態(tài)束定- 配套講稿:
如PPT文件的首頁顯示word圖標,表示該PPT已包含配套word講稿。雙擊word圖標可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設計者僅對作品中獨創(chuàng)性部分享有著作權。
- 關 鍵 詞:
- 北航 研究生課程 程序語言 設計 原理 教程 10
裝配圖網所有資源均是用戶自行上傳分享,僅供網友學習交流,未經上傳用戶書面授權,請勿作他用。
鏈接地址:http://www.820124.com/p-6827637.html