




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第十章 繼承 (Inheritance),繼承是面向?qū)ο笙到y(tǒng)的重要特性之一,它支持泛化和特化兩方面的抽象。 對(duì)繼承概念的需求: 一個(gè)類型僅適合于結(jié)構(gòu)和操作相同的 對(duì)象實(shí)例集 當(dāng)類型需要在結(jié)構(gòu)和操作上有所擴(kuò)充 或變異時(shí)如何處理? 方式1: 定義一個(gè)新的類型 問題:缺乏可重用性, 缺乏靈活性, 方式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;,引用語(yǔ)句: var mickeyMouse: E
3、mployee; miniMouse: Person; mickeyMouse.marry(miniMouse); /合法,miniMouse是Person miniMouse.marry(mickeyMouse); /非法,mickeyMouse非Person 以上方式無法體現(xiàn)一個(gè)雇員也是一個(gè)Person的語(yǔ)義,繼承和子類型的一般概念,繼承支持類型間的 is-a 聯(lián)系 繼承含有三方面語(yǔ)義: 1. 特化/泛化 的抽象語(yǔ)義 2. 子類型是父類型的一個(gè)擴(kuò)展 3. 可替換性語(yǔ)義(Substitutability),繼承的泛化抽象概念,類型的繼承設(shè)計(jì)是一個(gè)抽象過程: 由子類 超類是逐級(jí)的泛化抽象過程
4、其中:OTsuper 為 OTsub 的超類,OTsub為OTsuper的子 類,OTsub is-a OTsuper強(qiáng)調(diào)了任何屬于OTsub 的對(duì)象也屬于OTsuper。,OTsuper,OTsub,is-a,OTsuper,OTsub,is-a,OTsuper,OTsub,當(dāng)OTsub is-a OTsuper 時(shí)說明: 子類型OTsub的一個(gè)實(shí)例繼承了 OTsuper Type的所有特征(結(jié)構(gòu)、操 作),包括OTsuper從祖先繼承來的 所有特征 子類型OTsub的一個(gè)實(shí)例還具有 OTsub Type自定義的獨(dú)特的結(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語(yǔ)句也被繼承 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對(duì)象實(shí)例中的任一個(gè)實(shí)例對(duì)象,也屬于OTsuper的實(shí)例集合 即:若 oext(OTsub) 則 oext(OTsuper) 因此ext(OTsub)是ext(OTsuper)的一個(gè)真子集 任何一個(gè)子類的實(shí)例都可以被替換為超類的實(shí)例,oPerson,oEmployee,子類型Employee包含了超類型Person的所有屬性 如果僅針對(duì)Person特征的訪問,客戶無法區(qū)別被訪問的對(duì)象是Person還是Employee 因此,可以使用替換法則,在所有對(duì)Person引用的地方,用一個(gè)Employee實(shí)例不會(huì)破壞一致性 解決了類型特化后的靈
7、活性問題 編譯通過放松對(duì)類型檢查(引用和參數(shù)的啞實(shí)結(jié)合時(shí))的約束來解決子類型實(shí)例對(duì)超類型實(shí)例的可替換性,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),從實(shí)例集合的角度來看 超類Type2的實(shí)例集合是Type1集合的真子集,Type3是Type2的真子集 類型的實(shí)例集合構(gòu)成了對(duì)象的一個(gè)類別 class的概念 繼承的傳遞構(gòu)成了類型的層次結(jié)構(gòu) 從類型定義的角度來看,子類型是超類型的一個(gè)擴(kuò)展 子類型包含了超類型,類型層次結(jié)構(gòu)的根:ANY,對(duì)于數(shù)據(jù)庫(kù)而言,所有對(duì)象具有共同特征: 對(duì)象標(biāo)識(shí)OID 對(duì)象標(biāo)識(shí)的測(cè)試 標(biāo)識(shí)的識(shí)別 用戶不可見的系統(tǒng)操作 建立一個(gè)根類型為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;,繼承概念下得操作重定義,對(duì)于從超類繼承而來的操作,如果子類型有特殊的操作擴(kuò)展,GOM支持對(duì)被繼承的操作重定義 重定義用refine標(biāo)識(shí),對(duì)操作體進(jìn)行重寫,即定義子類型自己的操作版本 重定義的作用:既支持了操作的繼承,
12、又支持了子類型的特殊需求 子類型仍然可以引用超類中定義的各種算法 例如:在pipe中用Super.volume來引用Cylinder中的體積計(jì)算方法,重定義操作的動(dòng)態(tài)捆綁 (Dynamic Binding),需要有一個(gè)控制機(jī)制保證對(duì)重定義操作的正確引用,即保證接受者對(duì)象能引用它所需要的最特殊的操作方式 該控制機(jī)制不能通過靜態(tài)的類型檢查實(shí)現(xiàn) 原因:可替代性原理支持實(shí)例的類型替換,而不考慮是否真需要一個(gè)超類型,因此,在編譯時(shí)確定操作的版本是不可能的 只能在運(yùn)行時(shí)動(dòng)態(tài)檢查接受者類型并進(jìn)行相應(yīng)操作的動(dòng)態(tài)捆綁.,示例:一個(gè)Cylinder對(duì)象實(shí)例庫(kù) 這是一個(gè)合法的DB狀態(tài) 根據(jù)可替換性,id2,id3插
13、入到CylinderSet中時(shí)合法的,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上的一個(gè)體積計(jì)算迭代操作 var c
14、:Cylinder; totalVolume:float; foreach (c in manyCylinders) totalVolume:=totalVolume + c.volume; 在foreach的循環(huán)中,在語(yǔ)句c.volume執(zhí)行中,控制機(jī)制需要隨著接受者對(duì)象c的類型的不同選擇相應(yīng)的Volume版本。,一般的動(dòng)態(tài)捆綁選擇機(jī)制,從當(dāng)前接受者對(duì)象的直接類型開始,沿著繼承的層次結(jié)構(gòu)中指向根ANY的路徑進(jìn)行搜索,所遇到的第一個(gè)操作的實(shí)現(xiàn)體被執(zhí)行 該控制機(jī)制能保證相對(duì)于接受者對(duì)象的最特殊的版本被執(zhí)行。,GOM設(shè)計(jì)追求的兩個(gè)基本目標(biāo): 模型的靈活性: 利用繼承的子類型定義和可替換性原則提供了
15、模型的高度靈活性。即一方面可以逐級(jí)抽象,另一方面通過重定義操作可以滿足子類型的特殊要求,并利用可替換性,用戶可以沿類型層次上下結(jié)合,變換角色。 類型設(shè)計(jì)的類型安全:通過靜態(tài)類型檢查保證不能發(fā)生由于類型的不一致所導(dǎo)致的運(yùn)行錯(cuò)誤 這兩個(gè)要求互相矛盾,如何在保證類型安全下獲得最大靈活性,基于可替換性的類型定義/檢查規(guī)則,規(guī)則1:數(shù)據(jù)庫(kù)設(shè)計(jì)者所施加的靜態(tài)類型一致性約束必須被執(zhí)行 靜態(tài)類型約束為: 對(duì)于類型T的一個(gè)對(duì)象引用,必須確保該引用會(huì)獲得一個(gè)類型T或T的子類的實(shí)例對(duì)象 無論何時(shí),無論沿著什么程序控制路徑,無論對(duì)象庫(kù)處于何種狀態(tài),該約束必須被遵守。 規(guī)則2:類型檢查要驗(yàn)證一個(gè)類型的全部特征(操作或?qū)?/p>
16、性)都是可獲取的。即一個(gè)操作或?qū)傩缘囊帽仨毷墙邮苷邔?duì)象可獲取的。,保證類型安全的檢查(1),類型檢查按上述的兩個(gè)規(guī)則進(jìn)行 類型檢查的對(duì)象為:變量、屬性、集合和表的元素、操作說明等 按規(guī)則1的要求,對(duì)表達(dá)式賦值號(hào)兩端進(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會(huì)引用一個(gè)Employee實(shí)例,因此語(yǔ)句(2)在執(zhí)行時(shí)可能含有正確的引用。但編譯器不知道運(yùn)行時(shí)的情況,且不能保證在任何時(shí)刻都含有正確的引用,因此是不合法。,Person類型和Employee類型的一個(gè)樣庫(kù)示例,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);,一個(gè)類型一致性檢查過程示例,miniMouse.spo
20、use.boss := chief; 由于可替換性,賦值號(hào)左邊類型必須是右邊類型的一個(gè)超類或同類型,Person,Person,潛在的錯(cuò)誤,Employee,對(duì)于Sort類型,則必須左右類型相同 i := miniMouse.spouse.spouse.age;,int,Person,Person,Person,int,錨類型約束 (Anchor Type Constraints),錨的概念來自超文本,超文本利用超鏈聯(lián)結(jié)二個(gè)頁(yè)面,而錨則指明了進(jìn)入頁(yè)面的具體位置。GOM利用了錨的“定位”概念 靜態(tài)類型檢查會(huì)降低靈活性,而有些靈活性的實(shí)現(xiàn)并不會(huì)破壞狀態(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);/類型檢查報(bào)錯(cuò) 語(yǔ)句(3) (4)完成同樣功能,而(4)無論從什么角度來看,都不會(huì)造成DB的不一致性。,造成類型檢查過嚴(yán)的原因分
22、析及錨的引入,類型檢查是嚴(yán)格的按操作說明的各個(gè)參數(shù)類型來檢查的 有些操作,如incAge,其結(jié)果類型與接受者類型是相一致的, 如一個(gè)雇員增加一歲后仍是雇員 可以將結(jié)果類型與接受者類型捆綁,只要保證它們二者的類型一致就可以了,不必要一定嚴(yán)格按照類型說明來檢查 錨就起這個(gè)作用,GOM的錨的說明及語(yǔ)義,示例: declare incAge: Person | like self; declare incSalary: Employee | float like self; Like 象一樣 like self 指定結(jié)果類型與接受者類型self一致 Like 還可以指定類型是參數(shù)表中的某一個(gè)參數(shù)類型,
23、此時(shí),需要對(duì)照參數(shù)命令 示例: declare meeting : me:Person,he:Person like he; 編譯可以根據(jù)like后表示的各類型來檢查結(jié)果類型的合法性,合法操作的精化規(guī)則(Legal Operation Refinement),在繼承概念下一個(gè)重定義操作設(shè)計(jì)必須遵守規(guī)則為 (1)原操作名不變 (2)操作參數(shù)個(gè)數(shù)必須與原版本保持一致 目的:為了保證版本的兼容,即當(dāng)引用系統(tǒng)進(jìn)行模式演進(jìn)或增加新子功能時(shí),能使新不影響原有程序的運(yùn)行。 不影響現(xiàn)有應(yīng)用的類型擴(kuò)展使面向?qū)ο笙到y(tǒng)的主要目標(biāo) 在操作說明字句部分,能精化的只是參數(shù)類型(接受參數(shù)、變?cè)獏?shù)、結(jié)果參數(shù))的自由度,精化
24、操作的參數(shù)類型自由度約束條件,接受者參數(shù)類型 只能使原操作所指定的接受類型的子類型 目的:為了支持精化的要求 更特殊化 變?cè)獏?shù)類型 使原操作的變?cè)獏?shù)類型的超類型 目的:為了使操作更能與原祖先的同名操作兼容,參數(shù)類型必須更一般化。即新版的同名操作應(yīng)當(dāng)照顧它的祖先版本的要求,參數(shù)定義更一般化 結(jié)果參數(shù)類型 使原操作的結(jié)果類型的子類型 目的:是精化設(shè)計(jì)的要求,精化的結(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)用的錯(cuò)誤檢查: 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);/不可用,動(dòng)態(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,一個(gè)大學(xué)類型的層次結(jié)構(gòu),示例:每個(gè)教授每年出12篇論文 可以由教授和他所指導(dǎo)的學(xué)生(PhD)共同完成 定義一個(gè)寫論文操作: declare writePaper : Professor | PhDStudent Paper code ProfessorWritesPaper; 進(jìn)一步:一個(gè)高級(jí)教授應(yīng)當(dāng)能讓一個(gè)不一定是PhD的學(xué)生也能寫獲獎(jiǎng)?wù)撐?;改寫?refine writePape
28、r : FullProfessor | Student AwardPaper code FullProfessorWritesPaper;,接受參數(shù)精化,變參更一般化,結(jié)果參數(shù)精化,說明: (1) 一個(gè)高級(jí)教授讓一個(gè)學(xué)生(無論是否為PhD)都能保證寫一篇獲獎(jiǎng)?wù)撐?(2) 一個(gè)普通教授讓一個(gè)PhD也可以寫一篇論文,強(qiáng)類型約束(1),屬性類型的重定義是不合法的,破壞了繼承的可替換性原則 原因,由于類型的可替換性,在靜態(tài)檢查時(shí)重定義造成的類型不匹配錯(cuò)誤可能無法檢測(cè)到而在運(yùn)行時(shí)爆發(fā),Type Person type Employee supertype ANY is supertype Person is b
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 山西財(cái)經(jīng)大學(xué)《社會(huì)查理論與方法》2023-2024學(xué)年第一學(xué)期期末試卷
- 保險(xiǎn)職業(yè)學(xué)院《結(jié)構(gòu)設(shè)計(jì)原理》2023-2024學(xué)年第一學(xué)期期末試卷
- 湖北省武漢市武昌區(qū)八校2025屆九上化學(xué)期末質(zhì)量檢測(cè)試題含解析
- 廣東省深圳實(shí)驗(yàn)學(xué)校2024-2025學(xué)年八上物理期末檢測(cè)試題含解析
- 湖南機(jī)電職業(yè)技術(shù)學(xué)院《基礎(chǔ)俄語(yǔ)三外方》2023-2024學(xué)年第一學(xué)期期末試卷
- JJF 2258-2025關(guān)聯(lián)法天然氣發(fā)熱量測(cè)定儀校準(zhǔn)規(guī)范
- 材料堆放定制化管理辦法
- 商務(wù)差旅費(fèi)報(bào)銷管理辦法
- 青海水電設(shè)施管理辦法
- 處理公文計(jì)算機(jī)管理辦法
- 2025年入黨培訓(xùn)測(cè)試題庫(kù)及答案
- 電影音樂欣賞智慧樹知到期末考試答案章節(jié)答案2024年華南農(nóng)業(yè)大學(xué)
- 新蘇科版七年級(jí)下冊(cè)初中數(shù)學(xué)全冊(cè)教案
- 數(shù)學(xué)建模試卷分析
- 《干部履歷表》(電子版)
- 高一物理學(xué)案(必修1)
- 保密工作臺(tái)賬實(shí)用表格
- 2020女性生育力保存國(guó)際指南解讀(完整版)
- 廣東省初級(jí)中學(xué)學(xué)生學(xué)籍表
- 工商管理-樊登讀書020營(yíng)銷模式研究
- 再生水廠建設(shè)項(xiàng)目水處理工程施工組織設(shè)計(jì)(完整版)
評(píng)論
0/150
提交評(píng)論