资源描述:
《第十三章多重继承和多重替换multipleinheritanceandmultiple》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第十三章多重继承和多重替换MultipleInheritanceandMultipleSubstitutability多重继承—当一个子类从一个以上的超类型继承属性和方法多从替代—不同类型的对象之间的相互替代多重继承现实世界的复杂性,由于一个实体的多哥角色性,在进行泛化抽象时,常常需要从不同角度进行。反之,一个实体可以从不同继承特征,构成多重继承。如图OT3继承了OT1和OT2的全部特征(属性,操作)OT3是OT1和OT2的一个类型扩展OT3的实例既可以替换OT1实例,也可以替换OT2实例多重继承的有向无环图DAG多重继承构造了一个有向
2、无环图,其总根为ANY类型的层次结构是连通的,没有孤立子,从根可以到达每一个类型结点,反子亦然类型的层次结构是无回路的,即多重继承不支持递归若只有单重继承,则DAG转化为树GOM的多重继承是全继承概念多重继承带来的问题(一)操作OP的歧义--操作冲突冲突原因:一个op名字分别在不同父类(祖先)OT1,OT2中说明,操作体不同,则造成子类OT3在全继承情况下,op操作名的二义性。若op在共同的祖先,如OT0中被定义,但在不同的父类型如OT1,OT2中被分别重定义,从而造成在OT3中的二义性。操作二义性举例一个操作bonus(奖励)分别在S
3、tudent和Employee有定义,当一个奖励作用在”TA”上时,究竟应当怎么处理呢?declarebonus:Student
4、
5、floatdeclarebonus:Employee->void
6、
7、float->voidcodebonusForStudents;codebonusForEmps;definedefinebonusForStudents(gpaInc)isbonusForEmps(salInc)isself.gpa:=self.gpa*gpaInc;self.salary:=self.salary*salInc;;增加一
8、个百分点的GPA;增加一个百分点的SalaryvarbestEmp:Employee;bestStudent:Student;myTA,yourTA:TeachAsst;boss:Manager;…(1)bestEmp:=myTA;(2)bestEmp.bonus(1.1);!!假定应当增加salary(3)bestStudent:=yourTA;(4)bestStudent.bonus(1.05);!!假定应当增加gpa(5)boss.bonus(1.5);!!不会产生二义性多重继承的操作冲突解决方案注意:为了兼容已有程序,不能通过修
9、改超类中的操作名来解决问题解决冲突的方法定义优选权,允许用户指定继承的优先权用户通过对Supertype子句中超类型队列来指定优先权typeOTsupertypesOT1,…,OTnis方法(1)实现选择op的方法:A:首先确定op是否在本类型中被定义B:按DAG图,从优先队列中每一个超类开始,向上扫描每个枝条直到根,顺序检查op名称,首先被遇到的op被选中解决冲突之方法二--显式重命名对所继承的同名的操作,分别在当前子类型中重新命名虽然操作op的名字在超类中不能修改,但在当前子类中可以用重命名来代替,不会影响兼容性。TypeOTSup
10、ertypesOT1(renamesoptoop1)…OTm-1(renamesoptoopm-1)OTm,is…解决冲突方法三—重定义操作对op进行重新精化有两种选择:A:在当前子类型OT3中重新定义op操作B:在OT3中指定凡遇到op操作实际上将与哪一个超类的op捆绑。definetypeOT3supertypesOT1,OT2is…operationsrefineop…implementationdefineop…self.OT1$op(…);!!执行OT1中定义op方法endtypeOT3;多重继承带来的冲突二--类型冲突类型冲
11、突是更严重的且目前无法消解的问题(1)属性类型冲突:从不同的父类分别继承了一个同名但类型不同的属性如OT1.A与OT2.A类型不相容在OT3中对同名不相容的属性错误无法在静态编译时被检查出,只有在运行时才能出现。(2)操作类型冲突从不同的父类分别继承了一个同名但返回类型不同的操作。Delcaref:OT1
12、
13、…->T1Delcaref:OT2
14、
15、…->T2对于一个具有OT2类型的变量O2有一个引用链:O2.f(…).q(…),即函数q将由一个T2类型的实例引用。而函数程序运行时,当O2指向一个OT3实例时,函数f根据优先队列解决方法将选
16、择OT1的方法,其返回一个T1类型实例--与q所要求的相冲突。类型冲突示例—关于方法SkillStudent类型的Skill返回一个浮点值floatEmployee类型的Skill返回的一个字符串varmy