第十章 繼承 (Inheritance).ppt_第1頁
第十章 繼承 (Inheritance).ppt_第2頁
第十章 繼承 (Inheritance).ppt_第3頁
第十章 繼承 (Inheritance).ppt_第4頁
第十章 繼承 (Inheritance).ppt_第5頁
已閱讀5頁,還剩49頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第十章 繼承 (Inheritance),繼承是面向?qū)ο笙到y(tǒng)的重要特性之一,它支持泛化和特化兩方面的抽象。 對繼承概念的需求: 一個類型僅適合于結(jié)構(gòu)和操作相同的 對象實例集 當(dāng)類型需要在結(jié)構(gòu)和操作上有所擴(kuò)充 或變異時如何處理? 方式1: 定義一個新的類型 問題:缺乏可重用性, 缺乏靈活性, 方式2: 用繼承概念定義子類型,示例: persistent type Person is public name,age,spouse,marry body name : string; age:int; spouse : Person; operations declare marry: Person

2、void; implementation define marry(victim) is self.spouse:= victim; end type Person;,persistent type Employee is public name,age,spouse,marry,ss#,boss body operations declare marry : Person void; implementation define marry (victim) is self.spouse:= victim; end type Employee;,引用語句: var mickeyMouse: E

3、mployee; miniMouse: Person; mickeyMouse.marry(miniMouse); /合法,miniMouse是Person miniMouse.marry(mickeyMouse); /非法,mickeyMouse非Person 以上方式無法體現(xiàn)一個雇員也是一個Person的語義,繼承和子類型的一般概念,繼承支持類型間的 is-a 聯(lián)系 繼承含有三方面語義: 1. 特化/泛化 的抽象語義 2. 子類型是父類型的一個擴(kuò)展 3. 可替換性語義(Substitutability),繼承的泛化抽象概念,類型的繼承設(shè)計是一個抽象過程: 由子類 超類是逐級的泛化抽象過程

4、其中:OTsuper 為 OTsub 的超類,OTsub為OTsuper的子 類,OTsub is-a OTsuper強(qiáng)調(diào)了任何屬于OTsub 的對象也屬于OTsuper。,OTsuper,OTsub,is-a,OTsuper,OTsub,is-a,OTsuper,OTsub,當(dāng)OTsub is-a OTsuper 時說明: 子類型OTsub的一個實例繼承了 OTsuper Type的所有特征(結(jié)構(gòu)、操 作),包括OTsuper從祖先繼承來的 所有特征 子類型OTsub的一個實例還具有 OTsub Type自定義的獨特的結(jié)構(gòu) 和操作 從類型上看,子類型是超類型的一種擴(kuò)展,示例:,Person,

5、Employee,is-a,spouse,age,salary,boss,ss#,name,persistent type Employee supertype Person is public ss#,salary,boss,isRetired /public語句也被繼承 body ss# : int; salary: float; boss : Employee; operations declare isRetired: bool; return (self.age64); end type Employee; 繼承解決了類型間的代碼和結(jié)構(gòu)的可復(fù)用性,繼承的可替換性概念,OTsub is

6、-a OTsuper 從可替換性角度而言,強(qiáng)調(diào)了屬于OTsub對象實例中的任一個實例對象,也屬于OTsuper的實例集合 即:若 oext(OTsub) 則 oext(OTsuper) 因此ext(OTsub)是ext(OTsuper)的一個真子集 任何一個子類的實例都可以被替換為超類的實例,oPerson,oEmployee,子類型Employee包含了超類型Person的所有屬性 如果僅針對Person特征的訪問,客戶無法區(qū)別被訪問的對象是Person還是Employee 因此,可以使用替換法則,在所有對Person引用的地方,用一個Employee實例不會破壞一致性 解決了類型特化后的靈

7、活性問題 編譯通過放松對類型檢查(引用和參數(shù)的啞實結(jié)合時)的約束來解決子類型實例對超類型實例的可替換性,type Type1 is type Type2 is type Type3 is public A ,A supertype Type1 is supetype Type2 is body A:; public B,B public C,C body B: ; body C: ; end type Type1; end type Type2; end type Type3;,Type1,A,Type2,B,Type3,C,Types,is-a,is-a,A: ,A: B: ,A: B: C

8、: ,id1,id2,id3,Instances,Type1,Type2,Type3,ext(Type1),ext(Type2),ext(Type3),從實例集合的角度來看 超類Type2的實例集合是Type1集合的真子集,Type3是Type2的真子集 類型的實例集合構(gòu)成了對象的一個類別 class的概念 繼承的傳遞構(gòu)成了類型的層次結(jié)構(gòu) 從類型定義的角度來看,子類型是超類型的一個擴(kuò)展 子類型包含了超類型,類型層次結(jié)構(gòu)的根:ANY,對于數(shù)據(jù)庫而言,所有對象具有共同特征: 對象標(biāo)識OID 對象標(biāo)識的測試 標(biāo)識的識別 用戶不可見的系統(tǒng)操作 建立一個根類型為ANY來承接所有的共性操作,ANY,OT1

9、,is-a,OTn,is-a,is-a,is-a,is-a,is-a,is-a,is-a,Cylinder,ConicalPipe,Pipe,innerRadius2,radius2,innerRadius,center2,center1,radius,綜合舉例,persistent type Cylinder is public center1,center2,radius,length,volume body center1: Vertex; center2: Vertex; radius: float; operations declare length: float; declare

10、volume:float; implementation define length is return self.center.distance(self.center2) define volume is return self.radius * 2.0 * 3.14 * self.length; end type Cylinder;,persistent type Pipe supertype Cylinder is public innerRadius body innerRadius:float; operations declare hollowBodyVolume: float;

11、 refine volume: float; implementation define hollowBodyVolume is return self.innerRadius * 2.0 * 3.14 * self.length; define volume is return super.volume-self.hollowBodyVolume; end type Pipe;,繼承概念下得操作重定義,對于從超類繼承而來的操作,如果子類型有特殊的操作擴(kuò)展,GOM支持對被繼承的操作重定義 重定義用refine標(biāo)識,對操作體進(jìn)行重寫,即定義子類型自己的操作版本 重定義的作用:既支持了操作的繼承,

12、又支持了子類型的特殊需求 子類型仍然可以引用超類中定義的各種算法 例如:在pipe中用Super.volume來引用Cylinder中的體積計算方法,重定義操作的動態(tài)捆綁 (Dynamic Binding),需要有一個控制機(jī)制保證對重定義操作的正確引用,即保證接受者對象能引用它所需要的最特殊的操作方式 該控制機(jī)制不能通過靜態(tài)的類型檢查實現(xiàn) 原因:可替代性原理支持實例的類型替換,而不考慮是否真需要一個超類型,因此,在編譯時確定操作的版本是不可能的 只能在運(yùn)行時動態(tài)檢查接受者類型并進(jìn)行相應(yīng)操作的動態(tài)捆綁.,示例:一個Cylinder對象實例庫 這是一個合法的DB狀態(tài) 根據(jù)可替換性,id2,id3插

13、入到CylinderSet中時合法的,id1,id2,id3,manyCylinders,id0 CylinderSet,center1:id13 center2:id23 radius:10.0,id1 Cylinder,center1:id37 center2:id49 radius:5.0 innerRadius:2.5,id2 Pipe,center1:id55 center2:id77 radius:10.0 innerRadius:5.0 radius2:20.0 innerRadius2:10.0,id3 ConicalPipe,示例:在id0上的一個體積計算迭代操作 var c

14、:Cylinder; totalVolume:float; foreach (c in manyCylinders) totalVolume:=totalVolume + c.volume; 在foreach的循環(huán)中,在語句c.volume執(zhí)行中,控制機(jī)制需要隨著接受者對象c的類型的不同選擇相應(yīng)的Volume版本。,一般的動態(tài)捆綁選擇機(jī)制,從當(dāng)前接受者對象的直接類型開始,沿著繼承的層次結(jié)構(gòu)中指向根ANY的路徑進(jìn)行搜索,所遇到的第一個操作的實現(xiàn)體被執(zhí)行 該控制機(jī)制能保證相對于接受者對象的最特殊的版本被執(zhí)行。,GOM設(shè)計追求的兩個基本目標(biāo): 模型的靈活性: 利用繼承的子類型定義和可替換性原則提供了

15、模型的高度靈活性。即一方面可以逐級抽象,另一方面通過重定義操作可以滿足子類型的特殊要求,并利用可替換性,用戶可以沿類型層次上下結(jié)合,變換角色。 類型設(shè)計的類型安全:通過靜態(tài)類型檢查保證不能發(fā)生由于類型的不一致所導(dǎo)致的運(yùn)行錯誤 這兩個要求互相矛盾,如何在保證類型安全下獲得最大靈活性,基于可替換性的類型定義/檢查規(guī)則,規(guī)則1:數(shù)據(jù)庫設(shè)計者所施加的靜態(tài)類型一致性約束必須被執(zhí)行 靜態(tài)類型約束為: 對于類型T的一個對象引用,必須確保該引用會獲得一個類型T或T的子類的實例對象 無論何時,無論沿著什么程序控制路徑,無論對象庫處于何種狀態(tài),該約束必須被遵守。 規(guī)則2:類型檢查要驗證一個類型的全部特征(操作或?qū)?/p>

16、性)都是可獲取的。即一個操作或?qū)傩缘囊帽仨毷墙邮苷邔ο罂色@取的。,保證類型安全的檢查(1),類型檢查按上述的兩個規(guī)則進(jìn)行 類型檢查的對象為:變量、屬性、集合和表的元素、操作說明等 按規(guī)則1的要求,對表達(dá)式賦值號兩端進(jìn)行類型一致性檢查要求:,:=,超類型,同類型或子類型,示例: var somePerson: Person; someEmployee: Employee; (1) somePerson := someEmployee; (2) (3) someEmployee := somePerson; /不合法 Employee Person,保證類型安全的檢查(2),按規(guī)則2:被引用(訪

17、問)的屬性或操作必須是接受者類型所具有的。 示例: (1)someP;/合法 (2)somePerson.salary;/不合法 (3)someEmployee.salary; /合法 其中,可能somePerson會引用一個Employee實例,因此語句(2)在執(zhí)行時可能含有正確的引用。但編譯器不知道運(yùn)行時的情況,且不能保證在任何時刻都含有正確的引用,因此是不合法。,Person類型和Employee類型的一個樣庫示例,name:“Mini Mouse” Age:50 Spouse:id80,miniMouse,id99,name:“Mickey Mouse” Age:6

18、0 Spouse:id99 ss#:007 Boss:id45 Salary:90000.00,Person,mikeyMouse,id80,Employee,name:“Donald Duck” Age:40 Spouse:id1313 ss#:4711 Boss:id1717 Salary:80000.00,id45,Employee,chief,進(jìn)一步說明的例子: var miniMouse : Person; mickeyMouse : Employee; chief: Employee; i: integer; mickeyMouse.spouse := miniMouse /ok

19、miniMouse.spouse:= mickeyMouse;/ok mickeyMouse.boss:= chief; /ok miniMouse.spouse.boss:=chief; /非法 i:=mickeyMouse.boss.ss#; /ok i:=miniMouse.spouse.boss.ss#; /非法 i:=miniMouse.spouse.spouse.age; /ok i:=mickeyMouse.spouse.boss.ss#; / 非法 mickeyMouse.boss.spouse.marry(chief);,一個類型一致性檢查過程示例,miniMouse.spo

20、use.boss := chief; 由于可替換性,賦值號左邊類型必須是右邊類型的一個超類或同類型,Person,Person,潛在的錯誤,Employee,對于Sort類型,則必須左右類型相同 i := miniMouse.spouse.spouse.age;,int,Person,Person,Person,int,錨類型約束 (Anchor Type Constraints),錨的概念來自超文本,超文本利用超鏈聯(lián)結(jié)二個頁面,而錨則指明了進(jìn)入頁面的具體位置。GOM利用了錨的“定位”概念 靜態(tài)類型檢查會降低靈活性,而有些靈活性的實現(xiàn)并不會破壞狀態(tài)的一致性。,類型檢查降低靈活性的示例,decl

21、are incAge: Person | Person; declare incSalary: Employee | float Employee; var somePerson : Person; someEmp:Employee; somePerson.incAge.incAge; someEmp.incAge.incAge; someEmp.incSalary(1000.00).incAge; someEmp.incAge.incSalary(1000.00);/類型檢查報錯 語句(3) (4)完成同樣功能,而(4)無論從什么角度來看,都不會造成DB的不一致性。,造成類型檢查過嚴(yán)的原因分

22、析及錨的引入,類型檢查是嚴(yán)格的按操作說明的各個參數(shù)類型來檢查的 有些操作,如incAge,其結(jié)果類型與接受者類型是相一致的, 如一個雇員增加一歲后仍是雇員 可以將結(jié)果類型與接受者類型捆綁,只要保證它們二者的類型一致就可以了,不必要一定嚴(yán)格按照類型說明來檢查 錨就起這個作用,GOM的錨的說明及語義,示例: declare incAge: Person | like self; declare incSalary: Employee | float like self; Like 象一樣 like self 指定結(jié)果類型與接受者類型self一致 Like 還可以指定類型是參數(shù)表中的某一個參數(shù)類型,

23、此時,需要對照參數(shù)命令 示例: declare meeting : me:Person,he:Person like he; 編譯可以根據(jù)like后表示的各類型來檢查結(jié)果類型的合法性,合法操作的精化規(guī)則(Legal Operation Refinement),在繼承概念下一個重定義操作設(shè)計必須遵守規(guī)則為 (1)原操作名不變 (2)操作參數(shù)個數(shù)必須與原版本保持一致 目的:為了保證版本的兼容,即當(dāng)引用系統(tǒng)進(jìn)行模式演進(jìn)或增加新子功能時,能使新不影響原有程序的運(yùn)行。 不影響現(xiàn)有應(yīng)用的類型擴(kuò)展使面向?qū)ο笙到y(tǒng)的主要目標(biāo) 在操作說明字句部分,能精化的只是參數(shù)類型(接受參數(shù)、變元參數(shù)、結(jié)果參數(shù))的自由度,精化

24、操作的參數(shù)類型自由度約束條件,接受者參數(shù)類型 只能使原操作所指定的接受類型的子類型 目的:為了支持精化的要求 更特殊化 變元參數(shù)類型 使原操作的變元參數(shù)類型的超類型 目的:為了使操作更能與原祖先的同名操作兼容,參數(shù)類型必須更一般化。即新版的同名操作應(yīng)當(dāng)照顧它的祖先版本的要求,參數(shù)定義更一般化 結(jié)果參數(shù)類型 使原操作的結(jié)果類型的子類型 目的:是精化設(shè)計的要求,精化的結(jié)果自然應(yīng)當(dāng)是更特殊化,示例說明:不合法的marry精化定義 declare marry : Person | Person void code PersonMarriage; refine marry : Employee | Em

25、ployee void code EmployeeMarriage; define EmployeeMarriage(victim) is begin self.spouse:= victim; self.salary:= self.salary * 1.1; / 婚后需要更多錢養(yǎng)家 end;,不合法的定義導(dǎo)致應(yīng)用的錯誤檢查: var anEmp: Employee; aPerson: Person; anotherPerson: Person; (1) aPerson.marry(anEmp);/ok,marry的原始版本可用 (2) anEmp.marry(aPerson);/非法,精化的

26、marry操作需要參數(shù)Employee (3) anotherPerson:= anEmp; /ok,可替換 (4) anotherPerson.marry(aPerson);/不可用,動態(tài)綁定,合法的marry重定義: declare marry : Person | Person void code PersonMarriage; refine marry : Employee | Person void code Employee; define EmployeeMarriage(victim) is begin self.spouse := victim; self.salary :=

27、 self.salary * 1.1; end;,進(jìn)一步精化舉例,ANY,Student,PhDStudent,AwardPaper,Paper,FullProfessor,Professor,supertype,一個大學(xué)類型的層次結(jié)構(gòu),示例:每個教授每年出12篇論文 可以由教授和他所指導(dǎo)的學(xué)生(PhD)共同完成 定義一個寫論文操作: declare writePaper : Professor | PhDStudent Paper code ProfessorWritesPaper; 進(jìn)一步:一個高級教授應(yīng)當(dāng)能讓一個不一定是PhD的學(xué)生也能寫獲獎?wù)撐?;改寫?refine writePape

28、r : FullProfessor | Student AwardPaper code FullProfessorWritesPaper;,接受參數(shù)精化,變參更一般化,結(jié)果參數(shù)精化,說明: (1) 一個高級教授讓一個學(xué)生(無論是否為PhD)都能保證寫一篇獲獎?wù)撐?(2) 一個普通教授讓一個PhD也可以寫一篇論文,強(qiáng)類型約束(1),屬性類型的重定義是不合法的,破壞了繼承的可替換性原則 原因,由于類型的可替換性,在靜態(tài)檢查時重定義造成的類型不匹配錯誤可能無法檢測到而在運(yùn)行時爆發(fā),Type Person type Employee supertype ANY is supertype Person is b

溫馨提示

  • 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(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

提交評論