8繼承與替換_第1頁
已閱讀1頁,還剩10頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、第八章第八章繼承與替換繼承與替換學(xué)習(xí)面向?qū)ο缶幊痰牡谝徊骄褪抢斫庀旅孢@個原則:將一項(xiàng)任務(wù)組織成多個互相作用的松散耦合的軟件組件。在第6章和第7章里都是以這個組織原則為中心的。學(xué)習(xí)面向?qū)ο缶幊痰南乱徊骄褪腔诶^承這個概念將類組織成一個層次結(jié)構(gòu)。繼承(inheritance)可以使一個子類的實(shí)例存取與它的父類(超類)相關(guān)的數(shù)據(jù)和行為(方法)。81關(guān)于繼承的直觀描述關(guān)于繼承的直觀描述下面再來考慮一下第1章所提到的顧客Chris和花商Fredo

2、我們希望花商展示特定行為的原因并不是因?yàn)樗且粋€花商,而僅僅是因?yàn)樗且粋€店主。例如,我們期望Fred通過收款來完成交易并以收據(jù)作為反饋。這種行為并不只是對花商有效,對面包師、雜貨商、文具商、車商及其他商人都適用。這樣,就將花商的特定的行為與Shopkeeper這個更一般的類別聯(lián)系起來,并且由于Flists是店主的一個特殊表現(xiàn)形式,因此店主所具有的行為自動地也適用于花商這個子類。繼承在程序語言中的含義如下:子類所具有的數(shù)據(jù)和行為總是作為

3、與其相關(guān)的父類的屬性的擴(kuò)展(extension)(即更大的集合)。子類具有父類的所有屬性以及其他屬性。另一方面,由于子類是父類的更加特殊(或受限制)的形式,在某種程度上,子類也是父類的收縮(contraction)。作為擴(kuò)展和收縮之間的張力,繼承是許多技術(shù)的內(nèi)在來源,但同時也造成了許多對其使用的混亂。我們將在后面關(guān)于任何使用繼承的小節(jié)中看到這一現(xiàn)象。繼承總是可以傳遞的,這樣類就可以繼承各個級別的父類的特征。例如,如果Dog類是Mamma

4、l類的子類,并且Mammal類是Animal類的子類,那么,Dog類將繼承Mammal類和Animal類的屬性。811“是一個是一個”檢驗(yàn)檢驗(yàn)正如第2章所提到的那樣,在檢驗(yàn)兩個概念是否為繼承關(guān)系時,存在一項(xiàng)規(guī)則,這項(xiàng)規(guī)則稱為是一個(isa)檢驗(yàn)。具體內(nèi)容就是如果檢驗(yàn)概念A(yù)與概念B是否為繼承關(guān)系,那么就嘗試著套用這個英語語句:“A(n)Aisa(n)B”,如果這個語句“聽起來是對的”,那么這個繼承關(guān)系很可能就是正確的。例如,下面的這些描述

5、都是合理的說法。鳥是動物。貓是哺乳動物。蘋果派是派。文本窗口是窗口。球是圖形對象。整數(shù)數(shù)組是數(shù)組。另一方面,由于某種原因,下面的這些描述看起來就顯得很奇怪,因此,這些繼承關(guān)系可能不太合適。鳥是哺乳動物。蘋果派是蘋果。發(fā)動機(jī)是汽車。球是桌壁。整數(shù)數(shù)組是整數(shù)。雖然偶爾也有一些合理的繼承關(guān)系在進(jìn)行“是一個”檢驗(yàn)時失敗。但對于大多數(shù)情況,這種檢驗(yàn)都能就繼承技術(shù)使用的合理性給出一個可靠的信息。812使用繼承的原因使用繼承的原因Java語言也使用同

6、樣的關(guān)鍵字,但是對于Java語言,對保護(hù)特征的存取在聲明這個類所在的包內(nèi)是合法的。82不同語言中的繼承不同語言中的繼承面向?qū)ο缶幊陶Z言可以分為兩類:第一類語言要求每個類都必須繼承于已經(jīng)存在的父類,另一類語言則沒有此項(xiàng)要求。Java、Smallmlk、ObiectiveC和DelphiPal語言都是前者的實(shí)例,而C和ApplePal語言是后者的實(shí)例。對于前面一組語言,我們已經(jīng)見過用于表示繼承的語法,例如在第4章的圖43中。對于后面一組語言

7、,在圖8—1中,我們又重申并且展示了關(guān)于繼承的語法。對于那些要求所有的類都必須繼承于已存在的類的語言來說,一個好處就是存在一個關(guān)于所有對象的根類,這個根類在Smalltalk和ObjectiveC語言中表示為Object,在DelphiPal語言中表示為Tobject。這個根類提供的任何行為都被所有的對象所繼承。這樣,每一個對象都必然擁有一套公共的最小的函數(shù)集合。關(guān)于一個大的繼承樹的缺點(diǎn)是它將所有類結(jié)合成一個緊密耦合的單元。而對于C語言

8、及其他語言的程序來說,由于可以擁有幾個獨(dú)立的繼承層次,因此不必包含整個巨大的類庫,每個程序只使用其中的一小部分。當(dāng)然,這也意味著,程序員無法定義那種所有對象都必然包含的功能。有時也會從另外一種看待對象的視角來對語言進(jìn)行劃分,根據(jù)語言是使用動態(tài)類型還是使用靜態(tài)類型的情況將其分為兩類。對于動態(tài)語言,對象主要通過它所支持的消息進(jìn)行描述。如果兩個對象支持同一套消息,并且以類似的方式對其進(jìn)行響應(yīng),那么實(shí)際上,如果不考慮它們各自的類描述,將無法區(qū)分

9、兩個對象。在這種情況下,使所有對象都繼承于一個公共基類的大部分行為將很有用處。83子類、子類型和替換子類、子類型和替換讓我們考慮一下在靜態(tài)類型語言中,父類的數(shù)據(jù)類型與子類(或派生類)的數(shù)據(jù)類型之間的關(guān)系,就會發(fā)現(xiàn)以下的現(xiàn)象:?子類的實(shí)例必須擁有父類的所有數(shù)據(jù)成員。?子類的實(shí)例必須至少通過繼承(如果不是顯式地改寫)實(shí)現(xiàn)父類所定義的所有功能(子類也可以定義新功能,但此時并不重要)。?這樣,在某種條件下,如果用子類實(shí)例來替換父類實(shí)例,那么將會

10、發(fā)現(xiàn)子類實(shí)例可以完全模擬父類的行為,二者毫無差別。在本章的后面,我們將會看到,當(dāng)檢查關(guān)于繼承不同的使用方式時,以上結(jié)論并不總是有效。盡管如此,對于繼承,以上結(jié)論仍然是較好的理想化描述。由此,我們可以得出一條稱為替換原則(principleofsubstitution)的思想。替換原則是指如果有A和B兩個類,類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)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論