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