版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第04章 面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言,4.1 Smalltalk語(yǔ)言對(duì)象的思想最早源于人工智能研究,60年代末描述智能對(duì)象的框架(frame)即封裝了許多槽(slot),槽既可以是屬性(數(shù)據(jù))也可以是行為(操作)和(約束)。但最早見(jiàn)諸文獻(xiàn)是sketchpad提到的OO圖形學(xué)(1963)。60年代挪威的Dahl和Nyard為模擬系統(tǒng)研制了SIMULA-67語(yǔ)言,首先提出封裝的類和動(dòng)態(tài)生成實(shí)例對(duì)象的概念。60年代末,美國(guó)猶他大學(xué)Alan
2、Kay到Xerox公司PaloAlto研究中心參加了Dynabook項(xiàng)目。該項(xiàng)目的硬件是Star(個(gè)人機(jī)的前驅(qū))軟件是Smalltalk。1972年Dan Ingalls完成Smalltalk-72第一個(gè)實(shí)用版,以后又經(jīng)過(guò)-76-80兩次改進(jìn),Smalltalk-80成為向外發(fā)行的正式版本。,4.1 Smalltalk語(yǔ)言對(duì)象的思想最早源于人工智能研究,60年代末描述智能對(duì)象的框架(frame)即封裝了許多槽(slot),槽既可以是
3、屬性(數(shù)據(jù))也可以是行為(操作)和(約束)。但最早見(jiàn)諸文獻(xiàn)是sketchpad提到的OO圖形學(xué)(1963)。60年代挪威的Dahl和Nyard為模擬系統(tǒng)研制了SIMULA-67語(yǔ)言,首先提出封裝的類和動(dòng)態(tài)生成實(shí)例對(duì)象的概念。60年代末,美國(guó)猶他大學(xué)Alan Kay到Xerox公司PaloAlto研究中心參加了Dynabook項(xiàng)目。該項(xiàng)目的硬件是Star(個(gè)人機(jī)的前驅(qū))軟件是Smalltalk。1972年Dan Ingalls完成S
4、malltalk-72第一個(gè)實(shí)用版,以后又經(jīng)過(guò)-76-80兩次改進(jìn),Smalltalk-80成為向外發(fā)行的正式版本。,4.1.1 Smalltalk系統(tǒng),·語(yǔ)言核心(Kernel) ·程序設(shè)計(jì)系統(tǒng)·程序設(shè)計(jì)范型(Paradigm) ·用戶界面模型(User Interface Model),4.1.2 用戶界面模型,系統(tǒng)工作空間(System WorkSpace)工作空間(WorkSpac
5、e)系統(tǒng)副本(System Transcript)項(xiàng)目(Project)兩種圖形編輯窗(Form和Bit),系統(tǒng)瀏覽器(System Browser)窗,用戶就是按瀏覽窗中顯示的模板填寫程序。,4.1.3 語(yǔ)言核心,(1) 保留字只有五個(gè)nil,true,false,self,super(2) 字面量字符字面量 /數(shù)字面量 / 符號(hào)字面量 / 數(shù)組字面量(3) 限定符和特殊符號(hào) " ' $ #
6、#( ) , ; : | :=或← ↑ [ ] ( ) {} (4) 變量實(shí)例變量 / 類變量 / 臨時(shí)變量 / 全局變量 / 匯聚變量 / 參數(shù),(5) 消息表達(dá)式與語(yǔ)句,消息表達(dá)式的一般格式是: 對(duì)象 選擇子 參數(shù)Smalltalk的消息表達(dá)式有三種:·單目的 不帶參數(shù) tree class 消息class 發(fā)向tree,得到tree的類。 0.3
7、sin 消息sin 發(fā)向0.3,得sin(0.3) Array new 消息new 發(fā)向Array,創(chuàng)建-Array 的實(shí)例,對(duì)象,選擇子-參數(shù),,· 雙目的 3+4 消息‘+’帶參數(shù)4發(fā)向?qū)ο?,得對(duì)象7。 100@ 50 消息‘@’帶參數(shù)50發(fā)向?qū)ο?00,得(100,50) (sum/count) * reserve amount
8、 雙目,括號(hào)優(yōu)先 單目?jī)?yōu)先 雙目,,,,,·關(guān)鍵字消息表達(dá)式用關(guān)鍵字(帶有‘:’的選擇子)描述的雙目表達(dá)式,也是自左至右釋義。anArray at:3 put:100finances totalSpentOn:‘food’·賦值 變量在不同時(shí)間可賦以不同對(duì)象,任何表達(dá)式加上賦值前綴‘←’ quantity←19. name←‘chapter 1’。 foo
9、← array at:4。 數(shù)組第4元素與‘foo’同名,·塊表達(dá)式 [:x:y|BicPen goto:x@y] [:x:y|BicPen goto:x@y] value:100 value:250 BicPen goto 100@ 250 |aBlock| aBlock←['This is a String' displayAt:500@ 500]. Displa
10、y white. aBlock value,(6) 控制結(jié)構(gòu) 條件選擇一般形式是: 布爾子表達(dá)式 ifTrue:[‘真’塊執(zhí)行] ifFalse:[‘假’塊執(zhí)行] “可以不出現(xiàn)” 如:numberlistSize] whileFalse:[list at:index put:0。 index←index+1 ],(
11、7) 消息/方法消息模式 | 臨時(shí)變量 | 語(yǔ)句組 nawAt:initialLocation|newBox| newBox←self new. newBox setLoc:initiaPLocation tilt:0size:100 scribe:pen new. newBox show. setLoc:newLoc tilt:newTilt size:newSize seri
12、be:newScribe| | Loc←newLoc. titl←newTilt. size←newSize. scribe← new Scribe,Smalltalk是編譯—解釋執(zhí)行的,Smalltalk源程序經(jīng)編譯器得到虛映象(Virtual image),虛映象由字節(jié)代碼中間語(yǔ)言編寫,由Smalltalk虛機(jī)解釋執(zhí)行。相應(yīng)的文件系統(tǒng)管理三種文件:源文件、變更文件、映象文件。由于Smalltalk是交互式的,被編譯
13、的方法在執(zhí)行期間出了問(wèn)題要反應(yīng)到源程序,則要對(duì)映象文件施行反編譯(decompliation)Smalltalk的虛機(jī)是一個(gè)新軟件,它有三個(gè)功能部分:·存儲(chǔ)管理器·虛映象解釋器·基本例程 用匯編碼寫出的底層方法實(shí)現(xiàn),4.1.4 Smalltalk文件系統(tǒng)與虛機(jī),4.1.5 Smalltalk程序設(shè)計(jì)范型,程序設(shè)計(jì)在類的層次上進(jìn)行,由類靜態(tài)(于工作空間指明向類發(fā)出消息)或動(dòng)態(tài)(方法運(yùn)行時(shí))生成
14、實(shí)例對(duì)象。每個(gè)對(duì)象當(dāng)接受某消息并執(zhí)行其方法的消息表達(dá)式時(shí)都是在自向其它對(duì)象發(fā)消息。,4.1.5.1 一個(gè)簡(jiǎn)單的Smalltalk程序,統(tǒng)計(jì)字母出現(xiàn)頻率|s f| “定義了兩個(gè)臨時(shí)變量” s←Prompter prompt:‘enter line’ default:‘’. “s是Prompter的實(shí)例,將關(guān)鍵字表達(dá)式的結(jié)果束定于s” “意即輸入一行字符串,若不輸入,S為空串” f
15、←Bag new. “f是Bag的實(shí)例” s do:[:c|c(diǎn) isLetter ifTure:[f add:c asLowerCase]] “s在Prompter中找方法do:的模式,若找不到,找prompter的” “父類直到Object. C是塊變量,意從S中拿出某字符,isLetter” “是消息模式,判C是否字符,若為真執(zhí)行內(nèi)塊”。 “內(nèi)塊
16、中f找add:消息模式,從Bag直至上層父類,找到先執(zhí)” “行右邊子表達(dá)式”。 c asLowerCase是單目表達(dá)式,同樣要在Prompter中找asLowerCase匹配,也是不成向上找。它返回是“第k個(gè)”小寫字母,add:把它發(fā)送到對(duì)象f的第k個(gè)位置上并與原數(shù)相加。 ↑f “返回f中的值”.這個(gè)程序一共四句。如果掀鼠標(biāo)使菜單項(xiàng)‘doit’工作并輸入: “Small
17、talk is a programming Language for developing soluions to both simple and complex problem.”則輸出的f值是: 7 1 1 2 4 1 5 1 5 1 7 4 4 7 3 3 6 3 2 1 a b c d e f g h i k l m n o p r s t u
18、 v,例 字頻統(tǒng)計(jì)對(duì)比程序Pascal SmalltalkPROGRAM Frequency “無(wú)消息模式方法,宜寫算法”CONST Size=80; VAR s:string[size]; | s c f k | k,i:Integer;
19、 “定義了四個(gè)臨時(shí)變量” c:Char;f:ARRAY[1..26] OF Integer; f←Array new:26.BEGIN “f是Arrey實(shí)例長(zhǎng)度26” Writeln(‘enter line’); s←Prompter ReadIn(s);
20、 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
21、 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
22、 k:=ord(c)-ord(‘a(chǎn)’)+1; -$a asciiValue + 1. f[k]:=f[k]+1 f at:k put:(f at:k) + 1 END ] END; ]. FOR i:=1 T
23、o 26 DO ↑f Write(f[i],‘’) END.,4.1.5.2 類協(xié)議,,,,,4.1.5.3 一個(gè)完整的Smalltalk程序,家庭財(cái)務(wù)帳目 建立全部流水帳類,直接掛在Object上 class name FinancialHistory superclass Object
24、 instance variable names 'caseOnHand incomes expenditures' category 'Financial Tools' class method initialBalance:amount| | “建立流水帳本初始為amount(元)” ↑super new
25、 setinitialBalance:amounT new | | “建立流水帳本初始為0(元)” ↑super new setinitialBalance:0 instance method receive:amount from:source | | incomes at:source put:l
26、self total ReceivedFrom:source)+amount. “從來(lái)源source接收到的錢數(shù),因而手頭現(xiàn)金增加”. cashOnHand←cashOnHand + amount. incomes changed spend:amount for:reason | |
27、 “為事由reason支付的錢數(shù),因而手頭現(xiàn)金減少?!?expenditures at:reason put:(self totalSpentFor:reason) + amount.,,cashOnHand← cashOnHand - amount. expenditures changed CashOnHand| | “回答當(dāng)前手頭現(xiàn)金”
28、 ↑ cashOnHand expenditures | | “回答支出細(xì)目” ↑ expenditures incomes | | “回答收入細(xì)目” ↑ incomes totalReceiveFrom:source | | “回答自source收錢總數(shù)”
29、 (incomes includesKey:source) ifTrue:[↑incomes at:source] ifFalse:[↑0] totalSpentFor:reason | | “回答在reason項(xiàng)上總支出” (expenditures includesKey:reason) ifTrue:[↑expendit
30、ures at:reason] ifFalse:[↑0] private SetlnitialBalance:amount| | “實(shí)例變量初始化” cashOnHand←amount. incomes←Dictionary new. expenditures←Dictionary new,Smallt
31、alk at:# HouseholdFinances put:nil. HouseholdFinances←FinancealHistory initialBalance:1560 HouseholdFinances spend:700 for:'rent'. NouseholdFinances spend:78.53 for :'food'. HouseholdFinan
32、ces receive:820 from:'pay'. HouseholdFinances receive:22.15 from:'interest'. HouseholdFinances spend:135.65 for:'utilities'. HouseholdFinances spend:146.14 for:'food'.,4.1.6 Sma
33、lltalk程序設(shè)計(jì)系統(tǒng),在Smalltalk中,系統(tǒng)支持程序也是作為類掛在Object之下,包括算術(shù)運(yùn)算、數(shù)據(jù)和控制結(jié)構(gòu)的實(shí)現(xiàn)、輸入/出、隨機(jī)數(shù)生成器等。有一些類是輔助程序設(shè)計(jì)過(guò)程的,語(yǔ)法分析器、編譯器、解釋器、反編譯器這些對(duì)象的方法都有源代碼,目標(biāo)碼兩種形式。還有一些對(duì)象表示類和方法的結(jié)構(gòu),以便程序員追蹤系統(tǒng)。還有將方法和向其發(fā)消息的對(duì)象聯(lián)結(jié)起來(lái)的對(duì)象.這些對(duì)象統(tǒng)稱環(huán)境(contexts)類似其他語(yǔ)言實(shí)現(xiàn)中的堆棧幀和活動(dòng)記錄。
34、,4.2 Smalltalk的對(duì)象、類、方法的實(shí)現(xiàn) 類的存儲(chǔ),實(shí)例對(duì)象的存儲(chǔ) 實(shí)例對(duì)象只存放數(shù)據(jù),其存儲(chǔ)格式如下圖:,活動(dòng)記錄 ·環(huán)境部分 ·指令部分 ·發(fā)送者部分,4.3 面向?qū)ο?為什么需要面向?qū)ο螅?#160;OO 語(yǔ)言的發(fā)展 面向?qū)ο蟮幕靖拍?#160;封裝和繼承 初始化和終結(jié)處理 動(dòng)態(tài)
35、方法約束,重用的問(wèn)題,實(shí)踐中人們認(rèn)識(shí)到重用已有開(kāi)發(fā)結(jié)果的重要性,提出了軟件重用的概念· 最早的重用單元是子程序,如 Fortran 的子程序庫(kù)· 子程序是純粹的過(guò)程抽象,基于子程序的重用有很大局限性· 模塊是更合適的重用單元,因?yàn)槟K可以包裝任何功能,更靈活 重用中有一種常見(jiàn)情況:軟件開(kāi)發(fā)中遇到的新問(wèn)題
36、常與解決過(guò)的問(wèn)題(可以重用的庫(kù)提供的功能)類似,但又不完全相同 · 已有模塊的功能與需要有差異,無(wú)法以其“現(xiàn)有”形式直接使用 · 如果模塊功能的改變只能通過(guò)修改源代碼的方式進(jìn)行,程序員就只能拷貝這個(gè)模塊的源代碼,深入研究后再設(shè)法修改,以滿足新需求 但問(wèn)題是有沒(méi)有可以使用的源代碼?常常沒(méi)有: ·
37、;模塊可能是購(gòu)入的,提供商不提供源代碼 · 模塊可能是過(guò)去的遺產(chǎn),源代碼已經(jīng)丟失或部分缺失,重用和軟件開(kāi)發(fā),即使有源代碼,基于修改代碼的方式重用,也有很多問(wèn)題:· 修改代碼的代價(jià)可能很大(需要理解開(kāi)發(fā)者的想法、設(shè)計(jì)和大量細(xì)節(jié))· 修改代碼很容易引進(jìn)錯(cuò)誤· 經(jīng)過(guò)修改的代碼,其可讀性、易理解性和易
38、維護(hù)性都會(huì)惡化,多次修改導(dǎo)致這些性質(zhì)不斷惡化,可能給整個(gè)系統(tǒng)的質(zhì)量帶來(lái)嚴(yán)重危害· 修改后的模塊,繼續(xù)重用的可能性更小總之,基于修改代碼的重用,重用的價(jià)值大大降低了在軟件開(kāi)發(fā)過(guò)程,重用也是非常有價(jià)值的· 在同一軟件中重復(fù)使用某些部分,可使重要設(shè)計(jì)決策得到集中處理· 提高重用比率可能減少重復(fù)開(kāi)發(fā)工作量 ·
39、60; 對(duì)重要基礎(chǔ)功能的深度優(yōu)化可能非常耗工耗時(shí),重用已有的經(jīng)過(guò)精心調(diào)整的代碼,可能大大提高系統(tǒng)的性能,模塊和程序組織,常規(guī)的程序單元缺乏彈性,定義好的子程序/模塊都是固定功能的實(shí)體,難以提供“定制”的方式部分地改變功能以滿足實(shí)際需要的變化通過(guò)模塊定義的抽象數(shù)據(jù)類型是相互獨(dú)立的,不同模塊之間無(wú)任何關(guān)系而實(shí)際情況中,常常需要定義和使用一些相互有關(guān)的類型,可能需要把它們送給同一個(gè)函數(shù)/過(guò)程去處理,以同樣方式存儲(chǔ)變體和聯(lián)合機(jī)
40、制就是為了迎合這方面的需要,但它們沒(méi)有類型安全性,且未能提供解決類似問(wèn)題的統(tǒng)一框架,難用于應(yīng)付更復(fù)雜的情況支持相關(guān)類型,可能給程序的結(jié)構(gòu)組織帶來(lái)新的可能性如何在抽象數(shù)據(jù)類型的框架中提供這一類功能,也是需要解決的問(wèn)題面向?qū)ο蟮母拍钤谶@些方面都能發(fā)揮很大的作用面向?qū)ο螅∣bject-Oriented)的方法和程序技術(shù),為基于模塊(一個(gè)類也可以看作一個(gè)模塊)的重用問(wèn)題提供了一條解決途徑。,面向?qū)ο蠛椭赜?面向?qū)ο蠹夹g(shù)的最重要能力
41、,在于使程序員比較容易以一種外部附加的方式,在已有數(shù)據(jù)抽象的基礎(chǔ)上定義新的數(shù)據(jù)抽象OO 也支持定義有彈性的操作框架,使新的數(shù)據(jù)抽象可以使用這些框架,并把針對(duì)該類抽象的實(shí)例的具體操作插入框架中(重用和調(diào)整)新定義的抽象可以繼承原有抽象的行為,也可以根據(jù)需要調(diào)整改變已有功能的行為,或者添加新抽象所需要的新行為這樣大大提高了代碼重用的可能性(目標(biāo)是實(shí)現(xiàn)真正不加修改的重用。當(dāng)然,實(shí)際的重用可能性還與具體數(shù)據(jù)抽象的設(shè)計(jì)有關(guān))面
42、向?qū)ο筮€有另外的許多重要價(jià)值(有些可能同樣重要或更重要),并由此發(fā)展出“面向?qū)ο蟮南到y(tǒng)分析”,“面向?qū)ο蟮脑O(shè)計(jì)”等 面向?qū)ο笏枷雽?duì)于軟件領(lǐng)域的影響是全面的,是結(jié)構(gòu)化思想(結(jié)構(gòu)化程序設(shè)計(jì),結(jié)構(gòu)化分析,結(jié)構(gòu)化設(shè)計(jì)等)之后軟件開(kāi)發(fā)領(lǐng)域中的又一次革命 注意:面向?qū)ο蟛](méi)有取代結(jié)構(gòu)化,應(yīng)該看作是在另一層次上的抽象,OO 發(fā)展史,OO 技術(shù)和思想中的一個(gè)基本方面是數(shù)據(jù)和操作的封裝
43、3; 這方面的基本想法:一組數(shù)據(jù)與關(guān)聯(lián)之上相關(guān)的操作形成一個(gè)對(duì)象。其內(nèi)部數(shù)據(jù)構(gòu)成對(duì)象的狀態(tài),操作確定對(duì)象與外界交互的方式· OO 并不是從模塊化程序設(shè)計(jì)發(fā)展出來(lái)的,它有自己的發(fā)展歷程· OO 的思想與模塊化的思想是并行發(fā)展,一直相互影響、相互借鑒Simula 67 是 OO 概念的鼻祖
44、,其設(shè)計(jì)目標(biāo)是擴(kuò)充 Algol 60,以更好地支持計(jì)算機(jī)在模擬方面的應(yīng)用。1960 年代在挪威計(jì)算中心設(shè)計(jì)和實(shí)現(xiàn),主持其工作的 Ole-Johan Dahl 和 Kristen Nygaard 獲得 2001 年圖靈獎(jiǎng)· OO 的三個(gè)基本要素:封裝、繼承和動(dòng)態(tài)方法約束都源于
45、Simula· 類的概念源自 Simula,其設(shè)計(jì)中提出用類定義把一組操作與一組數(shù)據(jù)包裝起來(lái)。Simula 的這些重要想法是模塊概念和 OO 的起源· Simula 只提供了基本封裝,并沒(méi)有對(duì)封裝的保護(hù),也沒(méi)有信息隱藏,OO 發(fā)展史,軟件實(shí)踐也需要 OO 的思想,并逐漸開(kāi)發(fā)了 相關(guān)
46、的支撐技術(shù),包括:封裝的思想在面向模塊的語(yǔ)言里發(fā)展,提出了許多重要概念和想法,如· 作用域規(guī)則,開(kāi)的或者閉的作用域 · 界面與實(shí)現(xiàn)· 透明類型與隱晦類型,訪問(wèn)控制,等等數(shù)據(jù)驅(qū)動(dòng)的程序設(shè)計(jì)技術(shù):· 將計(jì)算功能(子程序)約束于程序里處理的數(shù)據(jù)(結(jié)構(gòu)),使我們?cè)诔绦蚶锟梢詮臄?shù)據(jù)對(duì)象出發(fā)去啟動(dòng)
47、相應(yīng)的計(jì)算過(guò)程· 在一些非常規(guī)的語(yǔ)言(如函數(shù)式語(yǔ)言)里,可以通過(guò)引用的概念提供函數(shù)/過(guò)程與數(shù)據(jù)之間的約束· 常規(guī)語(yǔ)言(如 C)引進(jìn)了指向函數(shù)的指針,在實(shí)現(xiàn)數(shù)據(jù)驅(qū)動(dòng)程序設(shè)計(jì)的過(guò)程中起到了重要作用,也成為面向?qū)ο笳Z(yǔ)言實(shí)現(xiàn)的技術(shù)基礎(chǔ),OO 發(fā)展史,繼承和動(dòng)態(tài)約束等被 Smalltalk 發(fā)展,形成目前 OO 的基本概
48、念框架 程序里以類的方式定義各種數(shù)據(jù)抽象 類可以通過(guò)繼承的方式擴(kuò)充新功能,這樣定義的新類(子類,派生類)自動(dòng)繼承已有類(基類,超類,父類)的功能對(duì)象是類的實(shí)例,是程序運(yùn)行時(shí)的基本數(shù)據(jù)單元派生類的對(duì)象也看作是原有基類的對(duì)象,可以當(dāng)作基類的對(duì)象使用(子類就是子類型,Liskov 代換原理,2008 年圖靈獎(jiǎng))類定義了對(duì)象的狀態(tài)成分(數(shù)據(jù)成員)和一組相關(guān)操作(稱為方法)方法調(diào)用總
49、是針對(duì)某個(gè)對(duì)象進(jìn)行的,將方法調(diào)用看作是給相應(yīng)對(duì)象送一個(gè)消息,對(duì)象通過(guò)執(zhí)行相應(yīng)操作的方式對(duì)消息做出響應(yīng)對(duì)一個(gè)消息執(zhí)行什么方法,由接收消息的對(duì)象的類型確定(根據(jù)該對(duì)象所屬的類確定,這就是動(dòng)態(tài)約束)計(jì)算,就是一組對(duì)象相互通訊的整體效果(對(duì)計(jì)算的另一種看法),OO 發(fā)展史,Smalltalk 還有一些獨(dú)特的東西: 變量采用引用模型,變量無(wú)類型,可以引用任何對(duì)象 語(yǔ)言里的一切都是對(duì)象:
50、60;· 類也是對(duì)象,通過(guò)給類送 new 消息的方式要求創(chuàng)建類的實(shí)例· 各種控制結(jié)構(gòu)也是通過(guò)消息概念建立的 條件和邏輯循環(huán)是邏輯對(duì)象對(duì)特定消息的響應(yīng) 枚舉循環(huán)是整數(shù)對(duì)象對(duì)特定消息的響應(yīng)采用單根的類層次結(jié)構(gòu),以類 Object 作為所有類的超類提供了塊(block)的概念,作為
51、控制結(jié)構(gòu)的抽象機(jī)制提出了容器的概念,開(kāi)發(fā)了一個(gè)功能豐富的類庫(kù)與程序開(kāi)發(fā)環(huán)境的緊密結(jié)合,并開(kāi)發(fā)了 GUI 的基本概念和相關(guān)技術(shù) Smalltalk 經(jīng)過(guò) 72、76 發(fā)展到 Smalltalk 80,其概念和結(jié)構(gòu)已臻成熟,OO 發(fā)展史,隨著 Smalltalk 的成功,人們看到了 OO 的潛在威力
52、許多人開(kāi)始研究如何把 OO 概念有效集成到常規(guī)語(yǔ)言里,提出了一批已有語(yǔ)言的 OO 擴(kuò)充和許多新 OO 語(yǔ)言,如 Object-Pascal、Object-C 等其中前期最成功并得到廣泛應(yīng)用的是 C++。C++ 在 OO 概念的廣泛接受和應(yīng)用方面功不可沒(méi)(具體理由見(jiàn)后面討論)。原因:·
53、160;在面向?qū)ο蠛透咝С绦蛑g取得較好的平衡· OO 概念與常規(guī)語(yǔ)言的合理集成(在當(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 的軟件開(kāi)發(fā)等等后來(lái)的其他成功語(yǔ)言包括
54、60;Java,微軟提出 C#,等等出現(xiàn)了一些基于對(duì)象的腳本語(yǔ)言,如 Python,Ruby 等現(xiàn)在,面向?qū)ο蟮拈_(kāi)發(fā)已經(jīng)成為一種主流的軟件開(kāi)發(fā)技術(shù),面向?qū)ο蟮幕靖拍?面向?qū)ο蟮幕靖拍睿涸诿嫦驅(qū)ο笳Z(yǔ)言里定義數(shù)據(jù)抽象的基本定義機(jī)制是類,在一個(gè)類里可以定義數(shù)據(jù)成員和子程序成員(稱為方法)封裝是數(shù)據(jù)抽象和模塊化的概念,與面向?qū)ο蟮母拍畈](méi)有必然關(guān)系,但封裝有助于更好發(fā)揮面向?qū)ο髾C(jī)制的作用(實(shí)
55、在的)類被看作類型,可以用于生成(定義)實(shí)例,稱為對(duì)象已有的類可以作為定義新類的基礎(chǔ)(基類、超類)· 可通過(guò)繼承方式定義新類(子類,派生類),子類繼承基類的行為· 子類可以修改基類已經(jīng)定義的行為,或者增加所需的新行為把子類看作是子類型(通常),如果 D 是 B 的子類,那么:· 若
56、0;o 是 D 類型的對(duì)象,那么 o 也看作是 B 類型的對(duì)象 · 若變量 x 可以引用 B 類的對(duì)象,那么它也可以引用 D 類的對(duì)象,面向?qū)ο蟮幕靖拍?繼承有兩方面作用 1. 建立類型之間的層次關(guān)系2.
57、0; 重用基類的行為(代碼和數(shù)據(jù)描述)對(duì)于面向?qū)ο蟮男袨槎?,前一方面的功能更為重要類中的子程序成員稱為方法,方法需要通過(guò)具體的對(duì)象調(diào)用在運(yùn)行中調(diào)用方法時(shí),實(shí)際調(diào)用的方法由作為調(diào)用出發(fā)點(diǎn)的那個(gè)對(duì)象的類型確定的(動(dòng)態(tài)約束)· 動(dòng)態(tài)約束是實(shí)現(xiàn)面向?qū)ο笮袨榈年P(guān)鍵 · 它為面向?qū)ο蟮臋C(jī)制提供了模塊機(jī)制所不具有的
58、彈性,使新的功能擴(kuò)充可以比較自然地結(jié)合到已有的操作過(guò)程里 · 理解動(dòng)態(tài)約束是理解面向?qū)ο蟮年P(guān)鍵,動(dòng)態(tài)約束的高效實(shí)現(xiàn)也是面向?qū)ο笳Z(yǔ)言的實(shí)現(xiàn)的關(guān)鍵,面向?qū)ο蟮恼Z(yǔ)言,雖然基本框架類似,不同面向?qū)ο笳Z(yǔ)言之間也存在很大差異:基本問(wèn)題:采用什么樣的對(duì)象模型采用單根的類層次結(jié)構(gòu),還是任意的類層次結(jié)構(gòu)?提供那些繼承方式?例如 C++ 里提供了三種繼承方式允許多
59、重繼承?還是只允許單繼承?是否提供豐富完善的訪問(wèn)控制機(jī)制? 采用基于繼承的模型,還是基于指派的模型基于類的模型,還是基于對(duì)象或原型的模型(如 JavaScript)對(duì)象本身的獨(dú)立性(是否允許不屬于任何一個(gè)類的對(duì)象)類本身是不是對(duì)象?,面向?qū)ο蟮恼Z(yǔ)言,其他情況:是不是追求“純粹”的面向?qū)ο笳Z(yǔ)言?· Smalltalk 盡可能追求“面向?qū)ο蟆崩硐?,完全?/p>
60、重新設(shè)計(jì)的新語(yǔ)言· Java 是接近理想的語(yǔ)言,但希望在形式上盡可能靠近常規(guī)語(yǔ)言· C++ 設(shè)法在支持系統(tǒng)程序設(shè)計(jì)的過(guò)程性語(yǔ)言 C 上“擴(kuò)充”支持面向?qū)ο蟮臋C(jī)制,是一種多范型語(yǔ)言,支持多種程序設(shè)計(jì)方式· 另外的一些語(yǔ)言(如Ada)采用可能很不同的方式支持面向?qū)ο蟮某绦蛟O(shè)計(jì),這里不準(zhǔn)備詳細(xì)介紹采
61、用值模型還是引用模型。從本質(zhì)上說(shuō),只有采用引用模型才能支持方法的動(dòng)態(tài)約束,因此大多數(shù)面向?qū)ο笳Z(yǔ)言采用引用模型· C++ 采用值模型,可以創(chuàng)建靜態(tài)對(duì)象或棧對(duì)象,但只有通過(guò)對(duì)象引用或指向?qū)ο蟮闹羔槻拍軐?shí)現(xiàn)面向?qū)ο蟮膭?dòng)態(tài)約束行為· Java 只能把 OO 功能應(yīng)用于用戶定義類型,基本類型采用值模型,面向?qū)ο蟮恼Z(yǔ)言,是否允許靜態(tài)對(duì)象或者堆棧對(duì)象(自動(dòng)對(duì)象)?多數(shù)
62、面向?qū)ο笳Z(yǔ)言只支持堆對(duì)象(通過(guò)動(dòng)態(tài)存儲(chǔ)分配創(chuàng)建的對(duì)象)· C++ 支持靜態(tài)對(duì)象和自動(dòng)對(duì)象,這種設(shè)計(jì)是希望盡可能借助于作用域規(guī)則來(lái)管理對(duì)象,避免依賴自動(dòng)存儲(chǔ)管理系統(tǒng)(GC)· 為在這種環(huán)境下編程,人們開(kāi)發(fā)了許多利用自動(dòng)對(duì)象的對(duì)象管理技術(shù),如句柄對(duì)象,對(duì)象的“創(chuàng)建即初始化”技術(shù)等是否依賴自動(dòng)廢料收集(GC)。由于 OO 程序常(顯式或隱式地)創(chuàng)建和丟棄對(duì)象,對(duì)象之
63、間常存在復(fù)雜的相互引用關(guān)系,由人來(lái)完成對(duì)象的管理和回收很困難。大多數(shù) OO 語(yǔ)言都依賴于自動(dòng)存儲(chǔ)回收系統(tǒng)· GC 的引入將帶來(lái)顯著的性能損失,還會(huì)造成程序行為更多的不可預(yù)見(jiàn)性(GC 發(fā)生的時(shí)刻無(wú)法預(yù)見(jiàn),其持續(xù)時(shí)間長(zhǎng)短也無(wú)法預(yù)計(jì))· Java 等許多語(yǔ)言都需要內(nèi)置的自動(dòng)廢料收集系統(tǒng)· C+
64、+ 是例外,其設(shè)計(jì)目標(biāo)之一是盡可能避免對(duì)自動(dòng)存儲(chǔ)回收的依賴,以支持系統(tǒng)程序設(shè)計(jì),提高效率,減少運(yùn)行時(shí)間上的不確定性,面向?qū)ο蟮恼Z(yǔ)言,是否所有方法都采用動(dòng)態(tài)約束?· 動(dòng)態(tài)約束很重要,但調(diào)用時(shí)會(huì)帶來(lái)一些額外的開(kāi)銷,如果需要調(diào)用的方法能夠靜態(tài)確定,采用靜態(tài)約束有速度優(yōu)勢(shì)· 大部分語(yǔ)言里的所有方法都采用動(dòng)態(tài)約束· C++ 和
65、 Ada 提供靜態(tài)約束(默認(rèn))和動(dòng)態(tài)約束兩種方式一些腳本語(yǔ)言也支持面向?qū)ο蟮母拍?。例如?#183; Ruby 是一個(gè)純面向?qū)ο蟮哪_本語(yǔ)言,其中的一切都是對(duì)象,全局環(huán)境看作一個(gè)匿名的大對(duì)象,全局環(huán)境里的函數(shù)看作這個(gè)對(duì)象的成員函數(shù)。它還有另外一些獨(dú)特性質(zhì)· JavaScript 支持一種基于對(duì)象和原型的面向?qū)ο竽P?。其中沒(méi)有類的概念,只有
66、對(duì)象。對(duì)象的行為繼承通過(guò)原型獲得,面向?qū)ο蟮恼Z(yǔ)言,人們還提出了許多與面向?qū)ο髾C(jī)制有關(guān)的新想法和模型許多新近的腳本語(yǔ)言提供了獨(dú)特的面向?qū)ο髾C(jī)制:例如· 基于對(duì)象原型(而不是類)的 OO 模型· 在基于類的模型中允許基于對(duì)象的行為覆蓋(可修改個(gè)別對(duì)象的行為)· 等等總而言之,雖然今天面向?qū)ο蟮哪P秃驼Z(yǔ)言已成為主流
67、程序設(shè)計(jì)方法和主流程序語(yǔ)言,但是這類語(yǔ)言還遠(yuǎn)未成熟,還正在發(fā)展和研究中· 許多語(yǔ)言的 OO 機(jī)制非常復(fù)雜,實(shí)際還不斷提出一些新要求,使一些OO 語(yǔ)言在發(fā)展中變得越來(lái)越復(fù)雜 · 如何提供一集足夠強(qiáng)大,而且又簡(jiǎn)潔清晰的機(jī)制支持 OO 的概念和程序設(shè)計(jì),還是這個(gè)領(lǐng)域中需要繼續(xù)研究的問(wèn)題 ·
68、60; OO 語(yǔ)言有關(guān)的理論研究還處在起步階段,也是本領(lǐng)域不成熟的標(biāo)志,OO 語(yǔ)言需要提供的新機(jī)制,定義類的語(yǔ)言機(jī)制(語(yǔ)言提供特殊的描述結(jié)構(gòu))描述或定義對(duì)象的機(jī)制繼承機(jī)制,描述類之間的繼承關(guān)系??赡芏x繼承關(guān)系的性質(zhì)(如 C++ 里的類繼承有 public、protected 和 private 三種方式)與對(duì)象交互的機(jī)制(方法調(diào)用,消息傳遞
69、)初始化新對(duì)象的機(jī)制(最好能自動(dòng)進(jìn)行,避免未初始化就使用的錯(cuò)誤)類類型對(duì)象的動(dòng)態(tài)轉(zhuǎn)換機(jī)制(轉(zhuǎn)換對(duì)一個(gè)具體對(duì)象的觀點(diǎn))控制類成員的訪問(wèn)權(quán)限的機(jī)制對(duì)象銷毀前的臨終處理機(jī)制(最好能自動(dòng)進(jìn)行)對(duì)象的存儲(chǔ)管理機(jī)制可能還有其他機(jī)制:運(yùn)行中判斷對(duì)象的類屬關(guān)系的機(jī)制、自反等等,4.3 面向?qū)ο蟮幕咎卣?P.Wegner總結(jié)了OO語(yǔ)言的發(fā)展, 給出以下圖示澄清了概念:封裝→ 對(duì)象(數(shù)據(jù)和操作)
70、 局部性、可維護(hù)性抽象→ + 類 概括描述、簡(jiǎn)單性繼承→ + 類體系 可重用性多態(tài)→ 重載、類屬 可擴(kuò)充性動(dòng)態(tài)束定→
71、面向?qū)ο?可交互性 基于對(duì)象的語(yǔ)言 基于類的語(yǔ)言 面向?qū)ο笳Z(yǔ)言 Ada 83, Actor CLU Smalltalk、 Eiffel simula 67
72、 C++, Ada 95, Java,,OO 程序,先看一點(diǎn) OO 程序,復(fù)習(xí)一下基本 OO 程序的特征這里看一段定義了幾個(gè)類的 C++ 代碼,定義 list_node 類,用于實(shí)現(xiàn)帶頭結(jié)點(diǎn)的雙向循環(huán)鏈接表,每個(gè)結(jié)點(diǎn)里有一個(gè)域指向表頭結(jié)點(diǎn),OO 程序,,定義 list_node 類,用于實(shí)現(xiàn)帶頭結(jié)點(diǎn)的雙向循環(huán)
73、鏈接表,每個(gè)結(jié)點(diǎn)里有一個(gè)域指向表頭結(jié)點(diǎn),OO 程序,定義一個(gè)list類,注意:header 是個(gè) list_node,定義的是有頭結(jié)點(diǎn)的循環(huán)鏈表,OO 程序,通過(guò)繼承定義 queue 類。(只是作為示例),OO 程序,還可以定義通用的容器類:· 基本容器類沒(méi)有具體數(shù)據(jù)域,不保存具體類型的元素,只實(shí)現(xiàn)容器操作,如:一些基本判
74、斷謂詞,插入刪除等等· 通過(guò)繼承實(shí)現(xiàn)存儲(chǔ)具體類型的元素的具體容器,每個(gè)結(jié)點(diǎn)里有一個(gè)域指向表頭結(jié)點(diǎn),OO 程序,,派生的 int 表結(jié)點(diǎn)類,使用這種 int 表的問(wèn)題:如果需要訪問(wèn)結(jié)點(diǎn)的數(shù)據(jù)內(nèi)容,必須對(duì)取出的結(jié)點(diǎn)做強(qiáng)制,通用的表結(jié)點(diǎn)類,面向?qū)ο蟾拍畹膶?shí)現(xiàn),實(shí)現(xiàn)面向?qū)ο蟮恼Z(yǔ)言,需要考慮它的幾個(gè)標(biāo)志性特征的實(shí)現(xiàn)封裝是一種靜態(tài)機(jī)制,如
75、60;C++/Java 一類語(yǔ)言的各種訪問(wèn)控制機(jī)制也是靜態(tài)的,都可以通過(guò)在符號(hào)表里記錄信息,在編譯中檢查和處理方法的實(shí)現(xiàn)與以模塊為類型時(shí)局部子程序的實(shí)現(xiàn)一樣。由于每個(gè)方法調(diào)用有一個(gè)調(diào)用對(duì)象,因此方法需要一個(gè)隱含指針,被調(diào)用時(shí)指向調(diào)用對(duì)象,所有對(duì)該對(duì)象的數(shù)據(jù)成員的訪問(wèn)都通過(guò)這個(gè)指針和靜態(tài)確定的偏移量進(jìn)行許多語(yǔ)言以這一指針作為一個(gè)偽變量,稱為 this 或者 self,通過(guò)這種指針訪問(wèn)調(diào)用對(duì)
76、象,方式上與通過(guò)指針訪問(wèn)普通結(jié)構(gòu)一樣實(shí)現(xiàn)面向?qū)ο笳Z(yǔ)言的關(guān)鍵是兩個(gè)問(wèn)題: · 繼承的實(shí)現(xiàn),使派生類型的對(duì)象能當(dāng)作基類的對(duì)象使用 · 動(dòng)態(tài)約束的實(shí)現(xiàn),能夠從(作為變量的值或者被變量引用的)對(duì)象出發(fā),找到這個(gè)對(duì)象所屬的類里定義的方法 下面討論實(shí)現(xiàn)的一些具體問(wèn)題,封裝,封裝是一種靜態(tài)機(jī)制,僅僅在程序加工階段起作用,有關(guān)情況與模塊機(jī)制類似,在
77、加工后的程序里(可執(zhí)行程序里)完全沒(méi)有關(guān)于封裝的信息不同語(yǔ)言里對(duì)類的訪問(wèn)控制可能不同:· 作為 “開(kāi)模塊”(允許以特定方式任意訪問(wèn)類成員) · 作為“閉模塊”(凡是沒(méi)有明確聲明可訪問(wèn)的都不可訪問(wèn))對(duì)基本封裝機(jī)制的擴(kuò)充是引進(jìn)進(jìn)一步的控制C++ 引進(jìn)成員的 public、protected 和 private 屬性,
78、提供細(xì)致的訪問(wèn)控制C++ 還允許定義派生類的不同繼承方式,控制對(duì)基類成員的訪問(wèn): · public 繼承 · protected 繼承,使基類的 public 成員變成派生類的 protected 成員 · private繼承,使基類
79、的所有成員變成派生類的 private 成員 一些新語(yǔ)言借鑒了 C++ 的這方面思想,可能結(jié)合另外一些想法,靜態(tài)域和靜態(tài)方法,許多面向?qū)ο笳Z(yǔ)言的類里可以定義靜態(tài)域和靜態(tài)方法· C++/Java 允許類里定義靜態(tài)數(shù)據(jù)域 · Smalltalk 把普通的對(duì)象域稱為實(shí)例變量,表示在這個(gè)類的每個(gè)
80、實(shí)例里都有這些成分的一份拷貝;把靜態(tài)數(shù)據(jù)域稱為類變量 · 類的靜態(tài)數(shù)據(jù)域并不出現(xiàn)在實(shí)例對(duì)象里,它們是類封裝的靜態(tài)數(shù)據(jù)成分,提出具有靜態(tài)生存期,在類的作用域里可直接訪問(wèn)。類外能否訪問(wèn)由語(yǔ)言確定(提出有與其他成員一樣的訪問(wèn)控制)靜態(tài)方法和靜態(tài)域的一些情況: · 類的靜態(tài)數(shù)據(jù)成員可以在靜態(tài)區(qū)實(shí)現(xiàn),在程序運(yùn)行之前靜態(tài)分配,在程序的整個(gè)執(zhí)行期間保持其存儲(chǔ)&
溫馨提示
- 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ù)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 第2章vb程序設(shè)計(jì)語(yǔ)言基礎(chǔ)
- 第1章java語(yǔ)言與面向?qū)ο蟮某绦蛟O(shè)計(jì)
- 1程序設(shè)計(jì)語(yǔ)言1程序設(shè)計(jì)語(yǔ)言的分類
- 面向?qū)ο蟮恼Z(yǔ)言程序設(shè)計(jì)
- 《程序設(shè)計(jì)語(yǔ)言c》
- 第1章java語(yǔ)言與面向?qū)ο蟮某绦蛟O(shè)計(jì)-唐大仕
- 程序設(shè)計(jì)語(yǔ)言c實(shí)驗(yàn)
- 邏輯式程序設(shè)計(jì)語(yǔ)言
- 如何學(xué)習(xí)程序設(shè)計(jì)語(yǔ)言
- 程序設(shè)計(jì)語(yǔ)言基礎(chǔ)答案
- 程序設(shè)計(jì)語(yǔ)言的層次體系
- 《面向?qū)ο蟪绦蛟O(shè)計(jì)》
- 程序設(shè)計(jì)語(yǔ)言(c)復(fù)習(xí)題-
- 知識(shí)點(diǎn)1程序設(shè)計(jì)語(yǔ)言
- r程序設(shè)計(jì)語(yǔ)言考試試卷
- 面向?qū)ο蟪绦蛟O(shè)計(jì)實(shí)驗(yàn)
- 實(shí)驗(yàn) 面向?qū)ο蟪绦蛟O(shè)計(jì)
- 《面向?qū)ο蟪绦蛟O(shè)計(jì)》 考試
- 《面向?qū)ο蟪绦蛟O(shè)計(jì)(java)》
- 面向?qū)ο蟪绦蛟O(shè)計(jì)報(bào)告
評(píng)論
0/150
提交評(píng)論