多重继承和多重替换.ppt

上传人:wuy****n92 文档编号:88509857 上传时间:2023-04-26 格式:PPT 页数:23 大小:356.32KB
返回 下载 相关 举报
多重继承和多重替换.ppt_第1页
第1页 / 共23页
多重继承和多重替换.ppt_第2页
第2页 / 共23页
点击查看更多>>
资源描述

《多重继承和多重替换.ppt》由会员分享,可在线阅读,更多相关《多重继承和多重替换.ppt(23页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、第十三章第十三章 多重继承和多重替换多重继承和多重替换Multiple Inheritance and Multiple Substitutability多重继承多重继承当一个子类从一个以上的超当一个子类从一个以上的超类型继承属性和方法类型继承属性和方法多从替代多从替代不同类型的对象之间的相互不同类型的对象之间的相互替代替代多重继承多重继承现实世界的复杂性现实世界的复杂性,由于由于一个实体的多哥角色性一个实体的多哥角色性,在进行泛化抽象时在进行泛化抽象时,常常常常需要从不同角度进行。需要从不同角度进行。反之反之,一个实体可以从不一个实体可以从不同继承特征同继承特征,构成多重继构成多重继承。承。

2、如图如图 OT3继承了继承了OT1和和OT2的全的全部特征(属性部特征(属性,操作)操作)OT3是是OT1和和OT2的一个类的一个类型扩展型扩展OT3的实例既可以替换的实例既可以替换OT1实例实例,也可以替换也可以替换OT2实实例例多重继承的有向无环图多重继承的有向无环图 DAG多重继承构造了一个有向多重继承构造了一个有向无环图,其总根为无环图,其总根为ANY类型的层次结构是连通的,类型的层次结构是连通的,没有孤立子,从根可以到没有孤立子,从根可以到达每一个类型结点,反子达每一个类型结点,反子亦然亦然类型的层次结构是无回路类型的层次结构是无回路的,即多重继承不支持递的,即多重继承不支持递归归若

3、只有单重继承,则若只有单重继承,则DAG转化为树转化为树GOM的多重继承是全继承的多重继承是全继承概念概念多重继承带来的问题多重继承带来的问题(一一)操作操作OP的歧义的歧义-操作冲突操作冲突冲突原因:冲突原因:一个一个op名字分别在不同父类名字分别在不同父类(祖先祖先)OT1,OT2中说明中说明,操作体不同操作体不同,则造成子类则造成子类OT3在全继在全继承情况下承情况下,op操作名的二义性。操作名的二义性。若若op在共同的祖先在共同的祖先,如如OT0中被定义中被定义,但在不但在不同的父类型如同的父类型如OT1,OT2中被分别重定义中被分别重定义,从从而造成在而造成在OT3中的二义性。中的二

4、义性。操作二义性举例操作二义性举例一个操作一个操作bonus(奖励奖励)分别在分别在Student和和Employee有定义有定义,当一个奖励作用在当一个奖励作用在”TA”上时上时,究竟应当怎究竟应当怎么处理呢?么处理呢?declare bonus:Student|float declare bonus:Employee -void|float-void code bonusForStudents;code bonusForEmps;define define bonusForStudents(gpaInc)is bonusForEmps(salInc)isself.gpa:=self.gpa

5、*gpaInc;self.salary:=self.salary*salInc;增加一个百分点的增加一个百分点的GPA ;增加一个百分点的增加一个百分点的Salaryvar bestEmp: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

6、);!不会产生二义性不会产生二义性多重继承的操作冲突解决方案多重继承的操作冲突解决方案注意:为了兼容已有程序注意:为了兼容已有程序,不能通过修改不能通过修改超类中的操作名来解决问题超类中的操作名来解决问题解决冲突的方法解决冲突的方法定义优选权定义优选权,允许用户指定继承的优先权允许用户指定继承的优先权用户通过对用户通过对Supertype子句中超类型队列来子句中超类型队列来指定优先权指定优先权type OT supertypes OT1,OTn is方法方法(1)实现选择实现选择op的方法的方法:A:首先确定首先确定op是否在本类型中被定义是否在本类型中被定义B:按按DAG图图,从优先队列中每

7、一个超类开始从优先队列中每一个超类开始,向上扫描每个枝条直到根向上扫描每个枝条直到根,顺序检查顺序检查op名称名称,首先被遇到的首先被遇到的op被选中被选中解决冲突之方法二解决冲突之方法二-显式重命名显式重命名对所继承的同名的操作对所继承的同名的操作,分别在当前子类型中重分别在当前子类型中重新命名新命名虽然操作虽然操作op的名字在超类中不能修改的名字在超类中不能修改,但在当前但在当前子类中可以用重命名来代替子类中可以用重命名来代替,不会影响兼容性。不会影响兼容性。Type OTSupertypes OT1(renames op to op1)OTm-1(renames op to opm-1)

8、OTm,is 解决冲突方法三解决冲突方法三重定义操作重定义操作对对op进行重新精化有两种选择:进行重新精化有两种选择:A:在当前子类型在当前子类型OT3中重新定义中重新定义op操作操作B:在在OT3中指定凡遇到中指定凡遇到op操作实际上将与哪一个超类的操作实际上将与哪一个超类的op捆绑。捆绑。define type OT3 supertypes OT1,OT2 is operations refine op implementation define op self.OT1$op();!执行执行OT1中定义中定义op方法方法end type OT3;多重继承带来的冲突二多重继承带来的冲突二-类

9、型冲突类型冲突类型冲突是更严重的且目前无法消解的类型冲突是更严重的且目前无法消解的问题问题(1)属性类型冲突属性类型冲突:从不同的父类分别继承了从不同的父类分别继承了一个同名但类型不同的属性一个同名但类型不同的属性如如OT1.A与与OT2.A类型不相容类型不相容在在OT3中对同名不相容的属性错误无法在静态编中对同名不相容的属性错误无法在静态编译时被检查出译时被检查出,只有在运行时才能出现。只有在运行时才能出现。(2)操作类型冲突)操作类型冲突从不同的父类分别继承了一个同名但返回类型不同的操作。从不同的父类分别继承了一个同名但返回类型不同的操作。Delcare f:OT1|T1Delcare f

10、:OT2|T2对于一个具有对于一个具有OT2 类型的变量类型的变量O2有一个引用链有一个引用链:O2.f().q(),即函数即函数q将由一个将由一个T2类型的实例引用。类型的实例引用。而函数程序运行时而函数程序运行时,当当O2指向一个指向一个OT3实例时,函数实例时,函数f根据根据优先队列解决方法将选择优先队列解决方法将选择OT1的方法,其返回一个的方法,其返回一个T1类型类型实例实例-与与q所要求的相冲突。所要求的相冲突。类型冲突示例类型冲突示例关于方法关于方法SkillStudent类型的类型的Skill返回一个浮点值返回一个浮点值floatEmployee类型的类型的Skill返回的一个

11、字符串返回的一个字符串var myTA:TeachAst;someStudent:Student;someEmp:Employee;empSkill:string;studentSkill:float;(1)someEmp:=myTA;someStudent:=myTA;(2)empSkill:=someEmp.skill;(3)studentSkill:=someStudent.skill多重继承的优点多重继承的优点多重继承可以支持实体的不同角色的抽象和特多重继承可以支持实体的不同角色的抽象和特征征示例示例:商业营销系统中的商品概念商业营销系统中的商品概念A:商品对象的使用特征商品对象的使用

12、特征-类别类别,规格规格,型号型号,产地产地,品牌品牌可以逐层抽象可以逐层抽象B:商品对象的价值特征商品对象的价值特征-进价进价,售价售价,利润利润,成本成本,供货商供货商,合同合同也可以从财务处理角度进行管理也可以从财务处理角度进行管理多重替换多重替换多重替换是针对某些多重继承不能清楚多重替换是针对某些多重继承不能清楚处理的情况下而采用的另外一种支持多处理的情况下而采用的另外一种支持多角色实体建模的方法角色实体建模的方法多重继承的局限性:多重继承的局限性:继承使类型间互相矛盾继承使类型间互相矛盾,全继承使类型的属性全继承使类型的属性集合杂乱无章集合杂乱无章继承可能导致冲突继承可能导致冲突示例

13、示例瑞士军刀瑞士军刀瑞士军刀有多个部件瑞士军刀有多个部件,小刀小刀,剪刀剪刀,钻,等钻,等瑞士军刀可以以它的某一部件的身份出现瑞士军刀可以以它的某一部件的身份出现如瑞士军刀是一把小刀;如瑞士军刀是一把小刀;瑞士军刀是一把剪子;瑞士军刀是一把剪子;瑞士军刀是一把钻子瑞士军刀是一把钻子 等等等等瑞士军刀的每一个部件可以单独使用瑞士军刀的每一个部件可以单独使用,其作用功其作用功能完全独立能完全独立,如一把剪刀如一把剪刀,一把小刀一把小刀 建模分析建模分析用多重继承概念建模用多重继承概念建模第一步:超类模型第一步:超类模型 Blade,Knife,Material,ScissorBlade,Sciss

14、or均有一个均有一个canCut操作操作第二步:瑞士军刀建模:第二步:瑞士军刀建模:type SwissKnife supertypes Knife,Scissor is;!见下面的讨论见下面的讨论 end type SwissKnife;若采用多重继承方法,缺点为若采用多重继承方法,缺点为(1)属性杂乱无章属性杂乱无章,(2)方法方法canCut重复定义重复定义,(3)瑞士军刀的某个部瑞士军刀的某个部件不能作为一个单独对象来使用件不能作为一个单独对象来使用多重替换建模方法多重替换建模方法以瑞士军刀为例以瑞士军刀为例type SwissKnife Supertype Knife is body

15、 knife:Knife;scissor:Scissor;fashion Knife via self.knife;fashion Scissor via self.scissor;end type SwissKnife;语句语句fashion Scissor via self.scissor 的语义为只的语义为只要瑞士军刀当作要瑞士军刀当作scissor看待,则所有的方法调看待,则所有的方法调用均转移到用均转移到SwissKnife的的Scissor部件部件多重替换的引用示例多重替换的引用示例var sk:SwissKnife;k:Knife;s:Scissor;p:WorkPiece;p.

16、create;sk.create;k:=sk;s:=sk;sk.canCut(p);k.canCut(p);s.canCut(p);代表代表(representation)问题问题替换概念也可以灵活的应用在两个类型替换概念也可以灵活的应用在两个类型之间之间代表问题示例代表问题示例当总公司召集各部门开会时,其关键在于,当总公司召集各部门开会时,其关键在于,要求各部门派一个代表,而并不指定必须是要求各部门派一个代表,而并不指定必须是谁谁部门在开会这种特定条件下,其行为就像一部门在开会这种特定条件下,其行为就像一个雇员,例如,一个部门可以插入到会议代个雇员,例如,一个部门可以插入到会议代表的雇员集合

17、中表的雇员集合中部门内部需要定义一个部门内部需要定义一个“代表代表”操作,一旦操作,一旦需要一个代表时,该操作可以产生一个具体需要一个代表时,该操作可以产生一个具体的雇员的雇员部门和雇员两个类型的替换部门和雇员两个类型的替换类型定义类型定义type Department supertype ANY is body members:Employee;manager:Manager;fashion Employee using self.representative;operations declare representative:-Employee;implementation define

18、representative is return self.manager;end type Department;部门和雇员两个类型的替换部门和雇员两个类型的替换引用的替换引用的替换var meetingParticipants:EmployeeSet;developmentDep:Department;bigBoss:Manager;someEmp:Employee;meetingParticipants.insert(bigBoss);!no meeting without himmeetingParticipants.insert(developmentDep);!they will send a representationforeach(emp in meetingParticipants)print(emp.name);

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 大学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com