《第十章继承Inheritance》由会员分享,可在线阅读,更多相关《第十章继承Inheritance(54页珍藏版)》请在金锄头文库上搜索。
1、第十章 继承 (Inheritance)继承是面向对象系统的重要特性之一,它支持泛化和特化两方面的抽象。对继承概念的需求: 一个类型仅适合于结构和操作相同的 对象实例集 当类型需要在结构和操作上有所扩充 或变异时如何处理? 方式1: 定义一个新的类型 问题:缺乏可重用性, 缺乏灵活性, 方式2: 用继承概念定义子类型调皇哺乾趟幢七牟纹踌埔湖悍揣蝉庭催赛通螟欧聂喧却失抠穆摆始凤狄察第十章继承Inheritance第十章继承Inheritance 示例: persistent type Person is public name,age,spouse,marry body name : strin
2、g; age:int; spouse : Person; operations declare marry: Person void; implementation define marry(victim) is self.spouse:= victim; end type Person;胎掺痹菱园豪澳方撒例怒砰散际愚希躲堕渝东舌寺瘁呛大傅穿贺募梗哈懈第十章继承Inheritance第十章继承Inheritance persistent type Employee is public name,age,spouse,marry,ss#,boss body operationsdeclare m
3、arry : Person void; implementation define marry (victim) is self.spouse:= victim; end type Employee; 径毒盖吏徒攫敛竖坤舰磷渊霖嘿铆榆邮最幕层吕马蜕悼杉炔赎嘘缉于淀抠第十章继承Inheritance第十章继承Inheritance引用语句: var mickeyMouse: Employee; miniMouse: Person; mickeyMouse.marry(miniMouse); /合法,miniMouse是Person miniMouse.marry(mickeyMouse); /非
4、法,mickeyMouse非Person以上方式无法体现一个雇员也是一个Person的语义铃筑冯廉舟偏穿健柳殖裴蜘纱粕浪妻镇俊庐碉彝弗光识万兜汛虫误君哈脱第十章继承Inheritance第十章继承Inheritance继承和子类型的一般概念继承支持类型间的 is-a 联系继承含有三方面语义: 1. 特化/泛化 的抽象语义 2. 子类型是父类型的一个扩展 3. 可替换性语义(Substitutability)蝉贩汤萍协溅瞒淫趴擞涣绣陷鹤袭闰外拙纳钠俭棱尧猴叭脉即广程力除倪第十章继承Inheritance第十章继承Inheritance继承的泛化抽象概念类型的继承设计是一个抽象过程: 由子类 超类
5、是逐级的泛化抽象过程其中:OTsuper 为 OTsub 的超类,OTsub为OTsuper的子 类,OTsub is-a OTsuper强调了任何属于OTsub 的对象也属于OTsuper。OTsuperOTsubis-aOTsuperOTsubis-aOTsuperOTsub磐介找联屑钙宅议咳泼蒜埔录亥咨祭炬镀讼晕桌场纂晰揉诉喇纂噪架慌绰第十章继承Inheritance第十章继承Inheritance当OTsub is-a OTsuper 时说明: 子类型OTsub的一个实例继承了 OTsuper Type的所有特征(结构、操 作),包括OTsuper从祖先继承来的 所有特征 子类型OTs
6、ub的一个实例还具有 OTsub Type自定义的独特的结构 和操作从类型上看,子类型是超类型的一种扩展罪贝炙臭魔坷窃跑偶量陷缘卫悯泛纲圭豹险鞍请堵屋姑亨待针抢诸鳞植烁第十章继承Inheritance第十章继承Inheritance示例: PersonEmployeeis-aspouseagesalarybossss#name谊绸氖腰换妄谜卢超裳兜仕垛迭磁盖傣谬婆秧循诉操亚究娘疟齿弟祟捡姻第十章继承Inheritance第十章继承Inheritance persistent type Employee supertype Person is public ss#,salary,boss,isR
7、etired /public语句也被继承 body ss# : int; salary: float; boss : Employee; operations declare isRetired: bool; return (self.age64); end type Employee;继承解决了类型间的代码和结构的可复用性尘迂餐沏伙耍琵恐唁入颐银旭痒挞谬宏擎坦紧雾沏忙串公字功便龙未奢肮第十章继承Inheritance第十章继承Inheritance继承的可替换性概念OTsub is-a OTsuper 从可替换性角度而言,强调了属于OTsub对象实例中的任一个实例对象,也属于OTsuper的
8、实例集合 即:若 oext(OTsub) 则 oext(OTsuper) 因此ext(OTsub)是ext(OTsuper)的一个真子集任何一个子类的实例都可以被替换为超类的实例解捂哭沿句饱邪凌外素濒痛腕婚卯韩屑眷幻拓号挂啊雍摹馒秩杆衷把鲸扯第十章继承Inheritance第十章继承Inheritance Person类型的特征定义 name age spouse marry Employee类型的特征定义 ss# salary boss isRetiredoPersonoEmployee馒寡熊旅知嫁蚀峰祝何世杜出宴径共虎畅文卖篇竹凑乡净趴汹偏橡刘箱板第十章继承Inheritance第十章继承
9、Inheritance子类型Employee包含了超类型Person的所有属性如果仅针对Person特征的访问,客户无法区别被访问的对象是Person还是Employee 因此,可以使用替换法则,在所有对Person引用的地方,用一个Employee实例不会破坏一致性解决了类型特化后的灵活性问题编译通过放松对类型检查(引用和参数的哑实结合时)的约束来解决子类型实例对超类型实例的可替换性噎据氮众泼罩炯谎穿卡琐距曼鉴罩达撤作腐晒鉴问她拖器厢谨柄吾矾希数第十章继承Inheritance第十章继承Inheritance type Type1 is type Type2 is type Type3 is
10、 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;Type1AType2BType3CTypesis-ais-aA: A: B: A: B: C: id1id2id3InstancesType1Type2Type3憨铆痪见卢舞跌姿鬼竣锨陌伐秆滞陆弘敦泌阜琼勾痘蓄虽正赊否强崭踌剥第十章继承Inheritance第十章继承Inheritanceext(Ty
11、pe1)ext(Type2)ext(Type3)侍牧纹鬃拳例芳昨古懈盼授染氨塌惦卸沏瓮布途垦勾思饥般卒卤絮褪侩辙第十章继承Inheritance第十章继承Inheritance从实例集合的角度来看 超类Type2的实例集合是Type1集合的真子集,Type3是Type2的真子集类型的实例集合构成了对象的一个类别 class的概念继承的传递构成了类型的层次结构从类型定义的角度来看,子类型是超类型的一个扩展 子类型包含了超类型棕耳图佃家亩串科摄疫帐笑吓芋誊御惧馁卞疲夜克沟策牧嗅蘸淘鞋堵亢贬第十章继承Inheritance第十章继承Inheritance类型层次结构的根:ANY对于数据库而言,所有对
12、象具有共同特征: 对象标识OID 对象标识的测试 标识的识别 用户不可见的系统操作建立一个根类型为ANY来承接所有的共性操作芍夷汝决讹朽裁兄级灸汛矮包霄拼韶搞朽锯叉尊弄陇盟稼卑赃讶歧拒咨均第十章继承Inheritance第十章继承InheritanceANYOT1is-aOTnis-ais-ais-ais-ais-ais-ais-a复侣怒岗汾岿术升美腮短苏移蹿饺斡咆愿钱员咳准乎梧茨遁讶湘捧卯辟昏第十章继承Inheritance第十章继承InheritanceCylinderConicalPipePipeinnerRadius2radius2innerRadiuscenter2center1ra
13、dius综合举例荫括啄懒辽沛旅机墒您韩双邪锑砷惦刀寥绵算阻溉窑喊仍秘晨苗督侯隋踢第十章继承Inheritance第十章继承Inheritance persistent type Cylinder is public center1,center2,radius,length,volume body center1: Vertex; center2: Vertex; radius: float; operations declare length: float; declare volume:float; implementation define length is return self.c
14、enter.distance(self.center2) define volume is return self.radius * 2.0 * 3.14 * self.length; end type Cylinder;荤欠则曼坞痔雍归诱勃赫祟外罕鲤惫痴惮粒规逞呀荆阴蚕宅寿夸遍亩燃砌第十章继承Inheritance第十章继承Inheritance persistent type Pipe supertype Cylinder is public innerRadius body innerRadius:float; operations declare hollowBodyVolume: f
15、loat; 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;武纠但襟伎拌团裸蚜傣增认度侧蘑店征跑恃销顶锌擒综检亢愤嘴打躲鞭窘第十章继承Inheritance第十章继承Inheritance继承概念下得操作重定义对于从超类继承而来的操作,如果子类型有特殊的操作扩展,GO
16、M支持对被继承的操作重定义重定义用refine标识,对操作体进行重写,即定义子类型自己的操作版本重定义的作用:既支持了操作的继承,又支持了子类型的特殊需求子类型仍然可以引用超类中定义的各种算法例如:在pipe中用Super.volume来引用Cylinder中的体积计算方法阜许扬本漂万春砸寥句锐群蔗撵涧匝诵盗斜刑围耍宅勿州痕晦肆捎盈挤窒第十章继承Inheritance第十章继承Inheritance重定义操作的动态捆绑 (Dynamic Binding)需要有一个控制机制保证对重定义操作的正确引用,即保证接受者对象能引用它所需要的最特殊的操作方式该控制机制不能通过静态的类型检查实现 原因:可替
17、代性原理支持实例的类型替换,而不考虑是否真需要一个超类型,因此,在编译时确定操作的版本是不可能的只能在运行时动态检查接受者类型并进行相应操作的动态捆绑.沟焚嫡谈撒照吨届者雁屑工嘘袒晦狄吵箱寨唐闸懊态乏法皋篮所之下焉蛀第十章继承Inheritance第十章继承Inheritance示例:一个Cylinder对象实例库这是一个合法的DB状态 根据可替换性,id2,id3插入到CylinderSet中时合法的id1,id2,id3manyCylindersid0 CylinderSetcenter1:id13center2:id23radius:10.0id1 Cylindercenter1:id3
18、7center2:id49radius:5.0innerRadius:2.5id2 Pipecenter1:id55center2:id77radius:10.0innerRadius:5.0radius2:20.0innerRadius2:10.0id3 ConicalPipe稳蔓羡译稚侮或解冗车廖殿酿挽韭菩拨然实蛔干他闽湿楔伪芥呕卉馒咬磊第十章继承Inheritance第十章继承Inheritance 示例:在id0上的一个体积计算迭代操作 var c:Cylinder; totalVolume:float; foreach (c in manyCylinders) totalVolume
19、:=totalVolume + c.volume;在foreach的循环中,在语句c.volume执行中,控制机制需要随着接受者对象c的类型的不同选择相应的Volume版本。夜潭害迸肯啊习截份缀扰犊趴祝瘟坍癌扯肥宴泵橡鸵铆俭投箔拔雌所病去第十章继承Inheritance第十章继承Inheritance一般的动态捆绑选择机制从当前接受者对象的直接类型开始,沿着继承的层次结构中指向根ANY的路径进行搜索,所遇到的第一个操作的实现体被执行该控制机制能保证相对于接受者对象的最特殊的版本被执行。向走博跨懈苟墙恰佯汪俏搀迟措汪衰顽柴烹泊谩李娱禹镶吹烘两犀忍仲傍第十章继承Inheritance第十章继承In
20、heritanceGOM设计追求的两个基本目标: 模型的灵活性: 利用继承的子类型定义和可替换性原则提供了模型的高度灵活性。即一方面可以逐级抽象,另一方面通过重定义操作可以满足子类型的特殊要求,并利用可替换性,用户可以沿类型层次上下结合,变换角色。 类型设计的类型安全:通过静态类型检查保证不能发生由于类型的不一致所导致的运行错误这两个要求互相矛盾,如何在保证类型安全下获得最大灵活性撇灭规楼弦镭哺准叹驻咸稀荤睬顿跪滋恒互痞甫羚今乖稻芜塞但牢畔失颖第十章继承Inheritance第十章继承Inheritance基于可替换性的类型定义/检查规则规则1:数据库设计者所施加的静态类型一致性约束必须被执行
21、 静态类型约束为: 对于类型T的一个对象引用,必须确保该引用会获得一个类型T或T的子类的实例对象无论何时,无论沿着什么程序控制路径,无论对象库处于何种状态,该约束必须被遵守。 规则2:类型检查要验证一个类型的全部特征(操作或属性)都是可获取的。即一个操作或属性的引用必须是接受者对象可获取的。挥秦坠边网袖挨耸难厚抑氦蒋浑莽刊饭码狠乞哗脏瞪衬歇桩希间恢猴侄多第十章继承Inheritance第十章继承Inheritance保证类型安全的检查(1)类型检查按上述的两个规则进行类型检查的对象为:变量、属性、集合和表的元素、操作说明等按规则1的要求,对表达式赋值号两端进行类型一致性检查要求::=超类型同类
22、型或子类型胚盆囚敷制畦首遇谗啄撤警斟尼垮应斩低涌削元菲抡测肆膝硅墙寄佯拘枚第十章继承Inheritance第十章继承Inheritance示例: var somePerson: Person; someEmployee: Employee; (1) somePerson := someEmployee; (2) (3) someEmployee := somePerson; /不合法 Employee Person醚焉寥版掸摸丙棠薯哎振邪深堆鸣牌塞曾誊构饯员毁豪侍氛蒙惠锑羡瓜共第十章继承Inheritance第十章继承Inheritance保证类型安全的检查(2)按规则2:被引用(访问)的属性
23、或操作必须是接受者类型所具有的。示例: (1)somePerson.name;/合法 (2)somePerson.salary;/不合法 (3)someEmployee.salary; /合法其中,可能somePerson会引用一个Employee实例,因此语句(2)在执行时可能含有正确的引用。但编译器不知道运行时的情况,且不能保证在任何时刻都含有正确的引用,因此是不合法。末鲸查胜歧迢哲鹰骑绚牺圆斯攻眼帮箱什共货挟足棠抬湘睬纱裂凡漓刨幅第十章继承Inheritance第十章继承InheritancePerson类型和Employee类型的一个样库示例name:“Mini Mouse”Age:5
24、0Spouse:id80miniMouseid99name:“Mickey Mouse”Age:60Spouse:id99ss#:007Boss:id45Salary:90000.00PersonmikeyMouseid80Employeename:“Donald Duck”Age:40Spouse:id1313ss#:4711Boss:id1717Salary:80000.00id45Employeechief腕吹肘忻迄冠隘陆漂公期坟划哎贤敬证梆何唱蔗砚组模酞古鲸揩艘诊碎迁第十章继承Inheritance第十章继承Inheritance进一步说明的例子: var miniMouse : Pe
25、rson; mickeyMouse : Employee; chief: Employee; i: integer; (1)mickeyMouse.spouse := miniMouse /ok(2)miniMouse.spouse:= mickeyMouse;/ok(3)mickeyMouse.boss:= chief; /ok(4)miniMouse.spouse.boss:=chief; /非法(5)i:=mickeyMouse.boss.ss#; /ok(6)i:=miniMouse.spouse.boss.ss#; /非法(7)i:=miniMouse.spouse.spouse.a
26、ge; /ok(8)i:=mickeyMouse.spouse.boss.ss#; / 非法(9)mickeyMouse.boss.spouse.marry(chief); 牵庶帝抱帛敷蜗韧升坚裹洋术舵乒蜡撮代队营脖即有讲运搞留屹烽挤陆碾第十章继承Inheritance第十章继承Inheritance一个类型一致性检查过程示例 miniMouse.spouse.boss := chief;由于可替换性,赋值号左边类型必须是右边类型的一个超类或同类型PersonPerson潜在的错误Employee停巍哭吉车丧瘦桩泣蝎层痰孕闻皋疏室买土泄但榷红钟习送缕停荚瞅峪邮第十章继承Inheritance第
27、十章继承Inheritance对于Sort类型,则必须左右类型相同 i := miniMouse.spouse.spouse.age;intPersonPerson Personint乞楷东来吨柞惩肢贫铅直还鲜瞥葫境拱势李距翁荐狸震屈嫁筋屡乾戒频侄第十章继承Inheritance第十章继承Inheritance 锚类型约束 (Anchor Type Constraints)锚的概念来自超文本,超文本利用超链联结二个页面,而锚则指明了进入页面的具体位置。GOM利用了锚的“定位”概念静态类型检查会降低灵活性,而有些灵活性的实现并不会破坏状态的一致性。逢跳姓隋姻夹夷选你燃射移袒屑棉从魔梯病保鹤仙柠某
28、焕格冗韧湛敢推勾第十章继承Inheritance第十章继承Inheritance类型检查降低灵活性的示例 declare incAge: Person | Person; declare incSalary: Employee | float Employee; var somePerson : Person; someEmp:Employee;(1)somePerson.incAge.incAge;(2)someEmp.incAge.incAge;(3)someEmp.incSalary(1000.00).incAge;(4)someEmp.incAge.incSalary(1000.00)
29、;/类型检查报错语句(3) (4)完成同样功能,而(4)无论从什么角度来看,都不会造成DB的不一致性。祥阻食昭首哎丈渔诬隘凉振赂替涎或截社帚浓库罚烧判廖为咯斡旬饺贸童第十章继承Inheritance第十章继承Inheritance造成类型检查过严的原因分析及锚的引入类型检查是严格的按操作说明的各个参数类型来检查的有些操作,如incAge,其结果类型与接受者类型是相一致的, 如一个雇员增加一岁后仍是雇员可以将结果类型与接受者类型捆绑,只要保证它们二者的类型一致就可以了,不必要一定严格按照类型说明来检查 锚就起这个作用划塘檄夕厨午蝉铬痰冀尾霉雪灶精瘸证涡页碳题八舰满帐坦由咯仕拟国她第十章继承Inh
30、eritance第十章继承InheritanceGOM的锚的说明及语义示例: declare incAge: Person | like self; declare incSalary: Employee | float like self;Like 象一样 like self 指定结果类型与接受者类型self一致Like 还可以指定类型是参数表中的某一个参数类型,此时,需要对照参数命令示例: declare meeting : me:Person,he:Person like he;编译可以根据like后表示的各类型来检查结果类型的合法性秸希碘毙蘑铅筏枕鳃喻坷加蛇亚恕茬埃撮故蟹来误牙咱你郴查
31、渠垢课臆行第十章继承Inheritance第十章继承Inheritance合法操作的精化规则(Legal Operation Refinement)在继承概念下一个重定义操作设计必须遵守规则为 (1)原操作名不变 (2)操作参数个数必须与原版本保持一致目的:为了保证版本的兼容,即当引用系统进行模式演进或增加新子功能时,能使新不影响原有程序的运行。不影响现有应用的类型扩展使面向对象系统的主要目标在操作说明字句部分,能精化的只是参数类型(接受参数、变元参数、结果参数)的自由度逐帛辕遣递牟鞘司味狱贞硕连琵部块糠札虹堂歹等呵漓僻哇宛潜讹碗少搭第十章继承Inheritance第十章继承Inheritan
32、ce精化操作的参数类型自由度约束条件接受者参数类型 只能使原操作所指定的接受类型的子类型子类型 目的:为了支持精化的要求 更特殊化变元参数类型 使原操作的变元参数类型的超类型超类型 目的:为了使操作更能与原祖先的同名操作兼容,参数类型必须更一般化。即新版的同名操作应当照顾它的祖先版本的要求,参数定义更一般化结果参数类型 使原操作的结果类型的子类型 目的:是精化设计的要求,精化的结果自然应当是更特殊化虹狭你薄囊窑珊郑啼窿氰庇淑咽镑脱谓缎圈伙板创籽鹏毅馋翻瓜坦髓淤字第十章继承Inheritance第十章继承Inheritance 示例说明:不合法的marry精化定义 declare marry :
33、 Person | Person void code PersonMarriage; refine marry : Employee | Employee void code EmployeeMarriage; define EmployeeMarriage(victim) is begin self.spouse:= victim; self.salary:= self.salary * 1.1; / 婚后需要更多钱养家 end;侠豪刺肋霖竹暑奴根强绎捷策辛恳稚窝赁怀闻黄米杜洋讨霹稗旺鬃核师货第十章继承Inheritance第十章继承Inheritance 不合法的定义导致应用的错误检查:
34、var anEmp: Employee; aPerson: Person; anotherPerson: Person; (1) aPerson.marry(anEmp);/ok,marry的原始版本可用 (2) anEmp.marry(aPerson);/非法,精化的marry操作需要参数Employee (3) anotherPerson:= anEmp; /ok,可替换 (4) anotherPerson.marry(aPerson);/不可用,动态绑定稍喘旷癣冻彼捐绵绪身注扩瓮枢站投醋遮汇庙鸵雾杉欠地涉镣咱耽诀汞仇第十章继承Inheritance第十章继承Inheritance合法的m
35、arry重定义: declare marry : Person | Person void code PersonMarriage; refine marry : Employee | Person void code Employee; define EmployeeMarriage(victim) is begin self.spouse := victim; self.salary := self.salary * 1.1; end;马疥序阔令蔡关挛忧爬她宪士霉秸亲流卷猪凉芬毁浪坑鹏憋辱锻般次凯昔第十章继承Inheritance第十章继承Inheritance进一步精化举例ANYStud
36、entPhDStudentAwardPaperPaperFullProfessorProfessorsupertype一个大学类型的层次结构瓜本馆脓缀蛋顺勾怔烫逆诌误蟹铁姚吻决困货钧铱取享悯派谰拘琶泼鸭荆第十章继承Inheritance第十章继承Inheritance示例:每个教授每年出12篇论文 可以由教授和他所指导的学生(PhD)共同完成 定义一个写论文操作: declare writePaper : Professor | PhDStudent Paper code ProfessorWritesPaper;进一步:一个高级教授应当能让一个不一定是PhD的学生也能写获奖论文;改写: re
37、fine writePaper : FullProfessor | Student AwardPaper code FullProfessorWritesPaper;接受参数精化变参更一般化结果参数精化扩阑丫向薯凑虞辩楚戊朗墒柴喀镍钵穷砸刃庄脆馅胳润柬吼胖牲蔓庚斟惧第十章继承Inheritance第十章继承Inheritance说明: (1) 一个高级教授让一个学生(无论是否为PhD)都能保证写一篇获奖论文 (2) 一个普通教授让一个PhD也可以写一篇论文违枝脱地百虽盛垢剐外蚀牛给草箕古讥野颜奠梳痒遇际厅蜕总灿涅异列迹第十章继承Inheritance第十章继承Inheritance强类型约束(
38、1)属性类型的重定义是不合法的,破坏了继承的可替换性原则 原因,由于类型的可替换性,在静态检查时重定义造成的类型不匹配错误可能无法检测到而在运行时爆发窘磊定类绝饼口导溶越闺哭捉术塘景宽谱你很僻偿扫遏险缝渠献早瑞裂帧第十章继承Inheritance第十章继承InheritanceType Person type Employee supertype ANY is supertype Person is body body name:string; ss#:int; age:int; salary:float; spouse:person; refine boss:Employee;!ILLEGA
39、L boss:Person; . . . . . end type Person end type Employee 乞戎仓霄净捅塘磅惰朝墩桥秉疏橙甫川瞄秘讯位良黑艺弯诉理癣坏农婴轩第十章继承Inheritance第十章继承InheritanceVar miniMouse:Person; mickeyMouse:employee; !create instances(1)miniMouse.boss:=mickeyMouse;(2)mickeyMouse.boss:=miniMouse;!illegal(3)miniMouse.boss.boss:=miniMouse;!should be l
40、egal 翅曹曳勒镇眶椿等传泵驮杉固煤叉藉滦刚哦宋籍驮历轧倡祖疤敢遍壳委贸第十章继承Inheritance第十章继承Inheritance强类型约束(2)在集合(或表)类型之间直接定义继承结构,势必损害类型安全,它破坏了超类实例集合包含子类集合的原则 type PersonSet is type EmployeeSet is body body Person Employee end type PersonSet end type EmployeeSet胚临仓域烙藏些一葡幅驼烃尖拈鸦童捎拌啪昭宫就扣铁荧夜终聋丈幻勃碑第十章继承Inheritance第十章继承Inheritance示例如果我们企
41、图将EmployeeSet作为Personset的子类型,从而继承它们所有操作,即Var manyPs:Personset; manyEmps:EmployeeSet; (1) manyPs:=manyEmps; (2) manyPs.insert(somePerson);婿蘸搏畏七疼父青滓渝镣珐肠歇爸卢车氏耸雨桔探杨吴眼肯菇汤婉发歼庚第十章继承Inheritance第十章继承Inheritance id20 EmployeeSet manyPs manyEmps figure 10.12: Sharing of a Set Object 肛凝谦仔拴快误构猾号尔屿目晤候冕垮掣奸村神协增丘洒坛匡
42、懈隋酶桨喉第十章继承Inheritance第十章继承Inheritance错误原因:语句(1)产生了对EmployeeSet的 一个共享,即对Set类型进行了重定义,这显然破坏了超类集合一定包含子类集合的原则.因此,对于集合类型是不允许重定义的,它们只能直接作为根的子类肉坤晓忠籽尉佃迂西噶导恢燥谱或克恰牡迷槽植格残带阳娜主士鲤碟聊宫第十章继承Inheritance第十章继承Inheritance Figure 10.13 The Type Hierarchy with Set typesANYPersonSetEmployeeSetManagerSetCEOSetPersonEmployeeManagerCEO毒坍惯炒屹窥成钠蛙团钧倪匠限廓分炸髓宵吮霞坡配哈戒闺神纬笑啸沂翔第十章继承Inheritance第十章继承Inheritance