【正文】
行的正式版本。但最早見諸文獻(xiàn)是 sketchpad提到的 OO圖形學(xué) (1963)。 60年代末,美國猶他大學(xué) Alan Kay到 Xerox公司 PaloAlto研究中心參加了 Dynabook項(xiàng)目。第四章 面向?qū)ο蟪绦蛟O(shè)計(jì)語言 Smalltalk語言 對象的思想最早源于人工智能研究, 60年代末描述智能對象的框架(frame)即封裝了許多槽 (slot),槽既可以是屬性 (數(shù)據(jù) )也可以是行為 (操作 )和 (約束 )。該項(xiàng)目的硬件是 Star(個(gè)人機(jī)的前驅(qū) )軟件是 Smalltalk。 60年代挪威的 Dahl和 Nyard為模擬系統(tǒng)研制了 SIMULA67語言,首先提出封裝的類和動(dòng)態(tài)生成實(shí)例對象的概念。 Smalltalk系統(tǒng) 用戶界面模型 (User Interface Model) 用戶界面模型 ? 系統(tǒng)工作空間(System WorkSpace) ? 工作空間(WorkSpace) ? 系統(tǒng)副本(System Transcript) ? 項(xiàng)目 (Project) ? 兩種圖形編輯窗(Form和 Bit) W o r k S p a c e S y s t e m W o rk s p a c eP ro j e c tB i t E d i t o rS y s t e m T r a n c ri p ta g a i nu n d oc o p yc u tp a s t ea c c e p tc a n c e le n t e rF o rm E d i t o r? 系統(tǒng)瀏覽器 (System Browser)窗 ? 用戶就是按瀏覽窗中顯示的模板填寫程序。 sin 消息 sin 發(fā)向 , 得 sin() Array new 消息 new 發(fā)向 Array, 創(chuàng)建 Array 的實(shí)例 對象 選擇子 參數(shù) anArray at: 3 put:100 finances totalSpentOn: ‘ food‘ 塊表達(dá)式 [:x:y| BicPen goto: xy] [:x:y| BicPen goto: xy] value: 100 value: 250 BicPen goto 100 250 | aBlock| aBlock←[39。相應(yīng)的文件系統(tǒng)管理三種文件:源文件、變更文件、映象文件?;纠? 用匯編碼寫出的底層方法實(shí)現(xiàn) Smalltalk文件系統(tǒng)與虛機(jī) Smalltalk程序設(shè)計(jì)范型 ? 程序設(shè)計(jì)在類的層次上進(jìn)行,由類靜態(tài) (于工作空間指明向類發(fā)出消息 )或動(dòng)態(tài) (方法運(yùn)行時(shí) )生成實(shí)例對象。 c asLowerCase是單目表達(dá)式 , 同樣要在 Prompter中找 asLowerCase匹配 , 也是不成向上找 。 f:ARRAY[1..26] OF Integer; f←Array new: 26. BEGIN ―f是 Arrey實(shí)例長度 26‖ Writeln(?enter line‘); s←Prompter ReadIn(s); prompt:?enterline‘ FOR i:=1TO 26 DO default: ‘’ . f[i]:=0; “ S是 Prompter的實(shí)例 , 裝輸入字串 ” FOR i:=1 To size DO 1 to:26 do:[:I|f at:I put:0]. BEGIN 1 to: size do:[:I| c:=aslowerCase(s[i]); c←(s at:i) asLowerCase. if isLetter (c) THEN c isLetter ifTrue: [ BEGIN k←c asciiValue k:=ord(c)ord(?a‘)+1; $ a asciiValue + 1. f[k]:=f[k]+1 f at:k put: (f at:k) + 1 END ] END; ]. FOR i:=1 To 26 DO ↑f Write(f[i], ‘’ ) END. 類協(xié)議 類 名超 類 名實(shí)例變量名類變量名匯集變量名 標(biāo)識符 標(biāo)識符 標(biāo)識符表 標(biāo)識符表 標(biāo)識符類方法: 方法 1 方法 2 . . 方法 n 實(shí)例方法 : 方法 1 方法 2 . . 方法 n單繼承,只一個(gè)用于實(shí)例對象用于類對象充作若干類共享的匯聚字典用于創(chuàng)建實(shí)例,并初始化如上例 Arr ay 中的方法 n ew:刻畫實(shí)例對象行為如上例中 a sLo w erC a se ,at:put :, isL e tte r 是對象s,f,c 的方法。Financial Tools39。. NouseholdFinances spend: for : 39。. HouseholdFinances receive: from: 39。. HouseholdFinances spend: for: 39。 還有一些對象表示類和方法的結(jié)構(gòu),以便程序員追蹤系統(tǒng)。 39。,0push39。push 39。+39。self39。,0return? grow : amount?self erase.size ← size+ amountself show? grow :? 消息模式 方法體 源代碼消息字典4實(shí)例對象的存儲 實(shí)例對象只存放數(shù)據(jù),其存儲格式如下圖 : 分類 loc tilt size scribe 長度 6b1實(shí)例變量名Box類類類10045500600 分類 loc tilt size scribe 長度 6 x y 長度 4500200Pointb2類類活動(dòng)記錄 最早的重用單元是子程序,如 Fortran 的子程序庫 – 如果模塊功能的改變只能通過修改源代碼的方式進(jìn)行,程序員就只能拷貝這個(gè)模塊的源代碼,深入研究后再設(shè)法修改,以滿足新需求 ? 但問題是有沒有可以使用的源代碼?常常沒有: – 這方面的基本想法:一組數(shù)據(jù)與關(guān)聯(lián)之上相關(guān)的操作形成一個(gè)對象。 1960 年代在挪威計(jì)算中心設(shè)計(jì)和實(shí)現(xiàn),主持其工作的 OleJohan Dahl 和 Kristen Nygaard 獲得 2020 年圖靈獎(jiǎng) – Simula 只提供了基本封裝,并沒有對封裝的保護(hù),也沒有信息隱藏 OO 發(fā)展史 軟件實(shí)踐也需要 OO 的思想,并逐漸開發(fā)了 相關(guān)的支撐技術(shù),包括: ? 封裝的思想在面向模塊的語言里發(fā)展,提出了許多重要概念和想法,如 – 將計(jì)算功能(子程序)約束于程序里處理的數(shù)據(jù)(結(jié)構(gòu)),使我們在程序里可以從數(shù)據(jù)對象出發(fā)去啟動(dòng)相應(yīng)的計(jì)算過程 – 各種控制結(jié)構(gòu)也是通過消息概念建立的 ? 條件和邏輯循環(huán)是邏輯對象對特定消息的響應(yīng) ? 枚舉循環(huán)是整數(shù)對象對特定消息的響應(yīng) ? 采用單根的類層次結(jié)構(gòu),以類 Object 作為所有類的超類 ? 提供了塊( block)的概念,作為控制結(jié)構(gòu)的抽象機(jī)制 ? 提出了容器的概念,開發(fā)了一個(gè)功能豐富的類庫 ? 與程序開發(fā)環(huán)境的緊密結(jié)合,并開發(fā)了 GUI 的基本概念和相關(guān)技術(shù) Smalltalk 經(jīng)過 7 76 發(fā)展到 Smalltalk 80,其概念和結(jié)構(gòu)已臻成熟 OO 發(fā)展史 隨著 Smalltalk 的成功,人們看到了 OO 的潛在威力 ? 許多人開始研究如何把 OO 概念有效集成到常規(guī)語言里,提出了一批已有語言的 OO 擴(kuò)充和許多新 OO 語言,如 ObjectPascal、 ObjectC 等 ? 其中前期最成功并得到廣泛應(yīng)用的是 C++。 OO 概念與常規(guī)語言的合理集成(在當(dāng)時(shí)),支持?jǐn)?shù)據(jù)抽象和面向?qū)ο蟮南到y(tǒng)設(shè)計(jì)和程序設(shè)計(jì),支持多泛型程序設(shè)計(jì)的結(jié)合,使與數(shù)據(jù)抽象和 OO 有關(guān)的許多新概念和新技術(shù)逐漸被實(shí)際軟件工作者接受 ? 隨后是 OO 分析、 OO 設(shè)計(jì)和基于 OO 的軟件開發(fā)等等 ? 后來的其他成功語言包括 Java,微軟提出 C,等等 ? 出現(xiàn)了一些基于對象的腳本語言,如 Python, Ruby 等 ? 現(xiàn)在,面向?qū)ο蟮拈_發(fā)已經(jīng)成為一種主流的軟件開發(fā)技術(shù) 面向?qū)ο蟮幕靖拍? 面向?qū)ο蟮幕靖拍睿? ? 在面向?qū)ο笳Z言里定義數(shù)據(jù)抽象的基本定義機(jī)制是類,在一個(gè)類里可以定義數(shù)據(jù)成員和子程序成員(稱為方法) ? 封裝是數(shù)據(jù)抽象和模塊化的概念,與面向?qū)ο蟮母拍畈]有必然關(guān)系,但封裝有助于更好發(fā)揮面向?qū)ο髾C(jī)制的作用 ? (實(shí)在的)類被看作類型,可以用于生成(定義)實(shí)例,稱為對象 ? 已有的類可以作為定義新類的基礎(chǔ)(基類、超類) – 若變量 x 可以引用 B 類的對象,那么它也可以引用 D 類的對象 面向?qū)ο蟮幕靖拍? ? 繼承有兩方面作用 1. 建立類型之間的層次關(guān)系 2. 重用基類的行為(代碼和數(shù)據(jù)描述) 對于面向?qū)ο蟮男袨槎?,前一方面的功能更為重? ? 類中的子程序成員稱為方法,方法需要通過具體的對象調(diào)用 ? 在運(yùn)行中調(diào)用方法時(shí),實(shí)際調(diào)用的方法由作為調(diào)用出發(fā)點(diǎn)的那個(gè)對象的類型確定的(動(dòng)態(tài)約束) – Smalltalk 盡可能追求 “面向?qū)ο?”理想,完全是重新設(shè)計(jì)的新語言 – 從本質(zhì)上說,只有采用引用模型才能支持方法的動(dòng)態(tài)約束,因此大多數(shù)面向?qū)ο笳Z言采用引用模型 – 為在這種環(huán)境下編程,人們開發(fā)了許多利用自動(dòng)對象的對象管理技術(shù),如句柄對象,對象的 “創(chuàng)建即初始化 ”技術(shù)等 ? 是否依賴自動(dòng)廢料收集( GC)。 Java 等許多語言都需要內(nèi)置的自動(dòng)廢料收集系統(tǒng) – C++ 和 Ada 提供靜態(tài)約束(默認(rèn))和動(dòng)態(tài)約束兩種方式 ? 一些腳本語言也支持面向?qū)ο蟮母拍睢? JavaScript 支持一種基于對象和原型的面向?qū)ο竽P汀? 在基于類的模型中允許基于對象的行為覆蓋(可修改個(gè)別對象的行為) – OO 語言有關(guān)的理論研究還處在起步階段,也是本領(lǐng)域不成熟的標(biāo)志 OO 語言需要提供的新機(jī)制 ? 定義類的語言機(jī)制(語言提供特殊的描述結(jié)構(gòu)) ? 描述或定義對象的機(jī)制 ? 繼承機(jī)制,描述類之間的繼承關(guān)系。 通過繼承實(shí)現(xiàn)存儲具體類型的元素的具體容器 每個(gè)結(jié)點(diǎn)里有一個(gè)域指向表頭結(jié)點(diǎn) OO 程序 派生的 int 表結(jié)點(diǎn)類 使用這種 int 表的問題: 如果需要訪問結(jié)點(diǎn)的數(shù)據(jù)內(nèi)容,必須對取出的結(jié)點(diǎn)做強(qiáng)制 通用的表結(jié)點(diǎn)類 面向?qū)ο筇卣鞯膶?shí)現(xiàn) ? 實(shí)現(xiàn)面向?qū)ο蟮恼Z言,需要考慮它的幾個(gè)標(biāo)志性特征的實(shí)現(xiàn) ? 封裝是一種靜態(tài)機(jī)制,如 C++/Java 一類語言的各種訪問控制機(jī)制也是靜態(tài)的,都可以通過在符號表里記錄信息,在編譯中檢查和處理 ? 方法的實(shí)現(xiàn)與以模塊為類型時(shí)局部子程序的實(shí)現(xiàn)一樣。 作為 “開模塊 ”(允許以特定方式任意訪問類成員) – private繼承,使基類的所有成員變成派生類的 private 成員 一些新語言借鑒了 C++ 的這方面思想,可能結(jié)合另外一些想法 靜態(tài)域和靜態(tài)方法 許多面向?qū)ο笳Z言的類里可以定義靜態(tài)域和靜態(tài)方法 – 類外能否訪問由語言確定(提出有與其他成員一樣的訪問控制) 靜態(tài)方法和靜態(tài)域的一些情況: – 類對象可以通過靜態(tài)數(shù)據(jù)成員交換或者共享信息 靜態(tài)域和靜態(tài)方法 – 靜態(tài)成員是靜態(tài)創(chuàng)建的,其初始化在程序開始執(zhí)行前完成(或者在語言定義的適當(dāng)時(shí)刻完成),只做一次 – 靜態(tài)成員的初始化中不能調(diào)用類的普通方法(因?yàn)闆]有對象) 靜態(tài)方法相當(dāng)于普通子程序