版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第八章第八章繼承與替換繼承與替換學(xué)習(xí)面向?qū)ο缶幊痰牡谝徊骄褪抢斫庀旅孢@個(gè)原則:將一項(xiàng)任務(wù)組織成多個(gè)互相作用的松散耦合的軟件組件。在第6章和第7章里都是以這個(gè)組織原則為中心的。學(xué)習(xí)面向?qū)ο缶幊痰南乱徊骄褪腔诶^承這個(gè)概念將類(lèi)組織成一個(gè)層次結(jié)構(gòu)。繼承(inheritance)可以使一個(gè)子類(lèi)的實(shí)例存取與它的父類(lèi)(超類(lèi))相關(guān)的數(shù)據(jù)和行為(方法)。81關(guān)于繼承的直觀描述關(guān)于繼承的直觀描述下面再來(lái)考慮一下第1章所提到的顧客Chris和花商Fredo
2、我們希望花商展示特定行為的原因并不是因?yàn)樗且粋€(gè)花商,而僅僅是因?yàn)樗且粋€(gè)店主。例如,我們期望Fred通過(guò)收款來(lái)完成交易并以收據(jù)作為反饋。這種行為并不只是對(duì)花商有效,對(duì)面包師、雜貨商、文具商、車(chē)商及其他商人都適用。這樣,就將花商的特定的行為與Shopkeeper這個(gè)更一般的類(lèi)別聯(lián)系起來(lái),并且由于Flists是店主的一個(gè)特殊表現(xiàn)形式,因此店主所具有的行為自動(dòng)地也適用于花商這個(gè)子類(lèi)。繼承在程序語(yǔ)言中的含義如下:子類(lèi)所具有的數(shù)據(jù)和行為總是作為
3、與其相關(guān)的父類(lèi)的屬性的擴(kuò)展(extension)(即更大的集合)。子類(lèi)具有父類(lèi)的所有屬性以及其他屬性。另一方面,由于子類(lèi)是父類(lèi)的更加特殊(或受限制)的形式,在某種程度上,子類(lèi)也是父類(lèi)的收縮(contraction)。作為擴(kuò)展和收縮之間的張力,繼承是許多技術(shù)的內(nèi)在來(lái)源,但同時(shí)也造成了許多對(duì)其使用的混亂。我們將在后面關(guān)于任何使用繼承的小節(jié)中看到這一現(xiàn)象。繼承總是可以傳遞的,這樣類(lèi)就可以繼承各個(gè)級(jí)別的父類(lèi)的特征。例如,如果Dog類(lèi)是Mamma
4、l類(lèi)的子類(lèi),并且Mammal類(lèi)是Animal類(lèi)的子類(lèi),那么,Dog類(lèi)將繼承Mammal類(lèi)和Animal類(lèi)的屬性。811“是一個(gè)是一個(gè)”檢驗(yàn)檢驗(yàn)正如第2章所提到的那樣,在檢驗(yàn)兩個(gè)概念是否為繼承關(guān)系時(shí),存在一項(xiàng)規(guī)則,這項(xiàng)規(guī)則稱(chēng)為是一個(gè)(isa)檢驗(yàn)。具體內(nèi)容就是如果檢驗(yàn)概念A(yù)與概念B是否為繼承關(guān)系,那么就嘗試著套用這個(gè)英語(yǔ)語(yǔ)句:“A(n)Aisa(n)B”,如果這個(gè)語(yǔ)句“聽(tīng)起來(lái)是對(duì)的”,那么這個(gè)繼承關(guān)系很可能就是正確的。例如,下面的這些描述
5、都是合理的說(shuō)法。鳥(niǎo)是動(dòng)物。貓是哺乳動(dòng)物。蘋(píng)果派是派。文本窗口是窗口。球是圖形對(duì)象。整數(shù)數(shù)組是數(shù)組。另一方面,由于某種原因,下面的這些描述看起來(lái)就顯得很奇怪,因此,這些繼承關(guān)系可能不太合適。鳥(niǎo)是哺乳動(dòng)物。蘋(píng)果派是蘋(píng)果。發(fā)動(dòng)機(jī)是汽車(chē)。球是桌壁。整數(shù)數(shù)組是整數(shù)。雖然偶爾也有一些合理的繼承關(guān)系在進(jìn)行“是一個(gè)”檢驗(yàn)時(shí)失敗。但對(duì)于大多數(shù)情況,這種檢驗(yàn)都能就繼承技術(shù)使用的合理性給出一個(gè)可靠的信息。812使用繼承的原因使用繼承的原因Java語(yǔ)言也使用同
6、樣的關(guān)鍵字,但是對(duì)于Java語(yǔ)言,對(duì)保護(hù)特征的存取在聲明這個(gè)類(lèi)所在的包內(nèi)是合法的。82不同語(yǔ)言中的繼承不同語(yǔ)言中的繼承面向?qū)ο缶幊陶Z(yǔ)言可以分為兩類(lèi):第一類(lèi)語(yǔ)言要求每個(gè)類(lèi)都必須繼承于已經(jīng)存在的父類(lèi),另一類(lèi)語(yǔ)言則沒(méi)有此項(xiàng)要求。Java、Smallmlk、ObiectiveC和DelphiPal語(yǔ)言都是前者的實(shí)例,而C和ApplePal語(yǔ)言是后者的實(shí)例。對(duì)于前面一組語(yǔ)言,我們已經(jīng)見(jiàn)過(guò)用于表示繼承的語(yǔ)法,例如在第4章的圖43中。對(duì)于后面一組語(yǔ)言
7、,在圖8—1中,我們又重申并且展示了關(guān)于繼承的語(yǔ)法。對(duì)于那些要求所有的類(lèi)都必須繼承于已存在的類(lèi)的語(yǔ)言來(lái)說(shuō),一個(gè)好處就是存在一個(gè)關(guān)于所有對(duì)象的根類(lèi),這個(gè)根類(lèi)在Smalltalk和ObjectiveC語(yǔ)言中表示為Object,在DelphiPal語(yǔ)言中表示為T(mén)object。這個(gè)根類(lèi)提供的任何行為都被所有的對(duì)象所繼承。這樣,每一個(gè)對(duì)象都必然擁有一套公共的最小的函數(shù)集合。關(guān)于一個(gè)大的繼承樹(shù)的缺點(diǎn)是它將所有類(lèi)結(jié)合成一個(gè)緊密耦合的單元。而對(duì)于C語(yǔ)言
8、及其他語(yǔ)言的程序來(lái)說(shuō),由于可以擁有幾個(gè)獨(dú)立的繼承層次,因此不必包含整個(gè)巨大的類(lèi)庫(kù),每個(gè)程序只使用其中的一小部分。當(dāng)然,這也意味著,程序員無(wú)法定義那種所有對(duì)象都必然包含的功能。有時(shí)也會(huì)從另外一種看待對(duì)象的視角來(lái)對(duì)語(yǔ)言進(jìn)行劃分,根據(jù)語(yǔ)言是使用動(dòng)態(tài)類(lèi)型還是使用靜態(tài)類(lèi)型的情況將其分為兩類(lèi)。對(duì)于動(dòng)態(tài)語(yǔ)言,對(duì)象主要通過(guò)它所支持的消息進(jìn)行描述。如果兩個(gè)對(duì)象支持同一套消息,并且以類(lèi)似的方式對(duì)其進(jìn)行響應(yīng),那么實(shí)際上,如果不考慮它們各自的類(lèi)描述,將無(wú)法區(qū)分
9、兩個(gè)對(duì)象。在這種情況下,使所有對(duì)象都繼承于一個(gè)公共基類(lèi)的大部分行為將很有用處。83子類(lèi)、子類(lèi)型和替換子類(lèi)、子類(lèi)型和替換讓我們考慮一下在靜態(tài)類(lèi)型語(yǔ)言中,父類(lèi)的數(shù)據(jù)類(lèi)型與子類(lèi)(或派生類(lèi))的數(shù)據(jù)類(lèi)型之間的關(guān)系,就會(huì)發(fā)現(xiàn)以下的現(xiàn)象:?子類(lèi)的實(shí)例必須擁有父類(lèi)的所有數(shù)據(jù)成員。?子類(lèi)的實(shí)例必須至少通過(guò)繼承(如果不是顯式地改寫(xiě))實(shí)現(xiàn)父類(lèi)所定義的所有功能(子類(lèi)也可以定義新功能,但此時(shí)并不重要)。?這樣,在某種條件下,如果用子類(lèi)實(shí)例來(lái)替換父類(lèi)實(shí)例,那么將會(huì)
10、發(fā)現(xiàn)子類(lèi)實(shí)例可以完全模擬父類(lèi)的行為,二者毫無(wú)差別。在本章的后面,我們將會(huì)看到,當(dāng)檢查關(guān)于繼承不同的使用方式時(shí),以上結(jié)論并不總是有效。盡管如此,對(duì)于繼承,以上結(jié)論仍然是較好的理想化描述。由此,我們可以得出一條稱(chēng)為替換原則(principleofsubstitution)的思想。替換原則是指如果有A和B兩個(gè)類(lèi),類(lèi)B是類(lèi)A的子類(lèi),那么在任何情況下都可以用類(lèi)B來(lái)替換類(lèi)A,而外界則毫無(wú)察覺(jué)。術(shù)語(yǔ)子類(lèi)型(sbutype)是指符合替換原則的子類(lèi)關(guān)系,
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
評(píng)論
0/150
提交評(píng)論