第十三章 多重继承和多重替换 Multiple Inheritance and Multiple Substitutability 多重继承 — 当一个子类从一个以上的超 类型继承属性和方法 多从替代 — 不同类型的对象之间的相互 替代.

Slides:



Advertisements
Similar presentations
首 页 首 页 上一页 下一页 本讲内容 投影法概述三视图形成及其投影规律平面立体三视图、尺寸标注 本讲内容 复习: P25~P31 、 P84~P85 作业: P7, P8, P14[2-32(2) A3 (1:1)]
Advertisements

第十二章 常微分方程 返回. 一、主要内容 基本概念 一阶方程 类 型 1. 直接积分法 2. 可分离变量 3. 齐次方程 4. 可化为齐次 方程 5. 全微分方程 6. 线性方程 类 型 1. 直接积分法 2. 可分离变量 3. 齐次方程 4. 可化为齐次 方程 5. 全微分方程 6. 线性方程.
概率统计( ZYH ) 节目录 3.1 二维随机变量的概率分布 3.2 边缘分布 3.4 随机变量的独立性 第三章 随机向量及其分布 3.3 条件分布.
第四章 犯罪概念与犯罪构成. 第一节 犯罪概念 一、犯罪概念的类型  (一)犯罪的形式概念  (二)犯罪的实质概念  (三)犯罪的混合概念.
Newsboy 模型简介 系统工程 裴英超.
PHPCMS 使用指南及二次开发向导 --- 系统设置篇 PHPCMS 网络培训课程 --- 系统设置篇 PHPCMS 项目部 王官庆制作 系统相关设置 1. 站点管理 2. 发布点管理 3. 系统其它设置 管理员设置 1. 角色定义 2. 管理员管理.
HistCite 结果分析示例 罗昭锋. By:SC 可能原因:文献年度过窄,少有相互引用.
一、拟合优度检验 二、变量的显著性检验 三、参数的置信区间
本幻灯为医用耗材集中询价采购网上操作说明,请参考收费说明、供应厂商流程等文件 综合学习。幻灯次序按操作次序进行,可配合自身用户名对照学习。 操作人员:所有类别 操作说明:所有标 new 标志的文件,务必仔细查看。原有用户名和信息均可继续使用,新 使用人员可点击注册申请使用.
4 第四章 矩阵 学时:  18 学时。 教学手段:  讲授和讨论相结合,学生课堂练习,演练习题与辅导答疑相结合。 基本内容和教学目的:  基本内容: 矩阵的运算,可逆矩阵,初等矩阵及其性质和意义, 分块矩阵。  教学目的:  1 .使学生理解和掌握矩阵等价的相关理论  2 .能熟练地进行矩阵的各种运算.
编译程序 构造原理和实现技术 授课教师:吕江花. 第一章 编译程序概述 主要内容: 几个基本概念 编译器的工作过程概述 编译器各个阶段的功能描述 编译程序的实现途径.
第二章 质点组力学 质点组:许多(有限或无限)相 互联系的质点组成的系统 研究方法: 1. 分离体法 2. 从整体考虑 把质点的三个定理推广到质点组.
嵌入式操作系统 陈香兰 Fall 系统调用 10/27/09 嵌入式 OS 3/12 系统调用的意义  操作系统为用户态进程与硬件设备进行交互提供 了一组接口 —— 系统调用  把用户从底层的硬件编程中解放出来  极大的提高了系统的安全性  使用户程序具有可移植性.
第 4 章 抽象解释 内容概述 以一种独立于编程语言的方式,介绍抽象解释的 一些本质概念 – 将 “ 程序分析对语言语义是正确的 ” 这个概念公式 化 – 用 “ 加宽和收缩技术 ” 来获得最小不动点的较好的 近似,并使所需计算步数得到限制 – 用 “ 伽罗瓦连接和伽罗瓦插入 ” 来把代价较大的属 性空间用代价较小的属性空间来代替.
吉林大学远程教育课件 主讲人 : 杨凤杰学 时: 64 ( 第六十二讲 ) 离散数学. 最后,我们构造能识别 A 的 Kleene 闭包 A* 的自动机 M A* =(S A* , I , f A* , s A* , F A* ) , 令 S A* 包括所有的 S A 的状态以及一个 附加的状态 s.
1 为了更好的揭示随机现象的规律性并 利用数学工具描述其规律, 有必要引入随 机变量来描述随机试验的不同结果 例 电话总机某段时间内接到的电话次数, 可用一个变量 X 来描述 例 检测一件产品可能出现的两个结果, 也可以用一个变量来描述 第五章 随机变量及其分布函数.
计算机文化基础 第 13 章 多表操作. 多表操作 以前所进行的操作中,在同一时刻只能打开一个表文 件,这是单工作区操作。但是在有些情况下,我们需要同时 了解多个表文件中的内容,例如 图 8-1 。在表文件 Stud1.DBF 中,有姓名,班级,电话三项;在 Stud2.DBF 中, 有姓名,性别,籍贯,英语四个字段。在单工作区操作方式.
主讲教师:陈殿友 总课时: 124 第八讲 函数的极限. 第一章 机动 目录 上页 下页 返回 结束 § 3 函数的极限 在上一节我们学习数列的极限,数列 {x n } 可看作自变量 为 n 的函数: x n =f(n),n ∈ N +, 所以,数列 {x n } 的极限为 a, 就是 当自变量 n.
吉林大学远程教育课件 主讲人 : 杨凤杰学 时: 64 ( 第三十八讲 ) 离散数学. 第八章 格与布尔代数 §8.1 引 言 在第一章中我们介绍了关于集 合的理论。如果将 ρ ( S )看做 是集合 S 的所有子集组成的集合, 于是, ρ ( S )中两个集合的并 集 A ∪ B ,两个集合的交集.
第十一章 曲线回归 第一节 曲线的类型与特点 第二节 曲线方程的配置 第三节 多项式回归.
第二部分 行政法律关系主体 第一节 行政主体 一、行政主体 (一)行政主体的概念 cc (二)行政主体资格含义及构成要件 CASE1CASE1\CASE2CASE2 (三)行政主体的职权和职责 1 、行政职权的概念及内容 2 、行政职权的特点 3 、行政职责.
线性代数习题课 吉林大学 术洪亮 第一讲 行 列 式 前面我们已经学习了关 于行列式的概念和一些基本 理论,其主要内容可概括为:
第二章 随机变量及其分布 第一节 随机变量及其分布函数 一、随机变量 用数量来表示试验的基本事件 定义 1 设试验 的基本空间为 , ,如果对试验 的每一个基 本事件 ,规定一个实数记作 与之对应,这样就得到一个定义在基本空 间 上的一个单值实函数 ,称变量 为随机变量. 随机变量常用字母 、 、 等表示.或用.
第 4 章 过程与变量的作用范围. 4.1 Visual Basic 的代码模块 Visual Basic 的应用程序是由过程组成的, 过程代码存放在模块中。 Visual Basic 提供了 三类模块,它们是窗体模块、标准模块和类 模块。 窗体模块 窗体模块是大多数 Visual Basic.
数 学 系 University of Science and Technology of China DEPARTMENT OF MATHEMATICS 第 3 章 曲线拟合的最小二乘法 给出一组离散点,确定一个函数逼近原函数,插值是这样的一种手段。 在实际中,数据不可避免的会有误差,插值函数会将这些误差也包括在内。
吉林大学远程教育课件 主讲人 : 杨凤杰学 时: 64 ( 第三十九讲 ) 离散数学. 例 设 S 是一个集合, ρ ( S )是 S 的幂集合,集合 的交( ∩ ),并(∪)是 ρ ( S )上的两个代数运算, 于是,( ρ ( S ), ∩ ,∪) 是一个格。而由例 知.
语义分析 主要内容:  语义分析概述 ( 必要性、功能、描述方法 )  符号表  类型表达式  声明和程序体的语义分析.
OS 进程调度模拟演示 制作人: 钱晶 高上上. OS 进程调度模拟-实验原理 静态优先级原理 在这种方式下,系统一旦把处理机分配给就绪队 列中的优先权最高的进程后,该进程便一直执行下去, 直至完成。或因为发生某事件使该进程放弃处理机,系 统方可再将处理机分配给另一优先级最高的进程。这些 事件包括有优先级更高的进程进入,或是因为某些原因.
第二章 贝叶斯决策理论 3学时.
量子化学 第四章 角动量与自旋 (Angular momentum and spin) 4.1 动量算符 4.2 角动量阶梯算符方法
数 学 系 University of Science and Technology of China DEPARTMENT OF MATHEMATICS 第 5 章 解线性方程组的直接法 实际中,存在大量的解线性方程组的问题。很多数值方 法到最后也会涉及到线性方程组的求解问题:如样条插值的 M 和.
主讲教师:陈殿友 总课时: 124 第十一讲 极限的运算法则. 第一章 二、 极限的四则运算法则 三、 复合函数的极限运算法则 一 、无穷小运算法则 机动 目录 上页 下页 返回 结束 §5 极限运算法则.
在发明中学习 线性代数 概念的引入 李尚志 中国科学技术大学. 随风潜入夜 : 知识的引入 之一、线性方程组的解法 加减消去法  方程的线性组合  原方程组的解是新方程的解 是否有 “ 增根 ” ?  互为线性组合 : 等价变形  初等变换  高斯消去法.
第一节 相图基本知识 1 三元相图的主要特点 (1)是立体图形,主要由曲面构成; (2)可发生四相平衡转变; (3)一、二、三相区为一空间。
第五节 学习要点 对句子的分析,向来是从句型、句类、句式的角度进行的。 以这三个角度为切入点,我们可以建立句型系统、句类系统和句 式系统。 ★句型系统 —— 按照句子的结构模式划分出来的类型系统。
第 3 章 控制流分析 内容概述 – 定义一个函数式编程语言,变量可以指称函数 – 以 dynamic dispatch problem 为例(作为参数的 函数被调用时,究竟执行的是哪个函数) – 规范该控制流分析问题,定义什么是可接受的控 制流分析 – 定义可接受分析在语义模型上的可靠性 – 讨论分析算法.
吉林大学远程教育课件 主讲人 : 杨凤杰学 时: 64 ( 第五十三讲 ) 离散数学. 定义 设 G= ( V , T , S , P ) 是一个语法结构,由 G 产生的语言 (或者说 G 的语言)是由初始状态 S 演绎出来的所有终止符的集合, 记为 L ( G ) ={w  T *
平行线的平行公理与判定 九年制义务教育七年级几何 制作者:赵宁睿. 平行线的平行公理与判定 要点回顾 课堂练习 例题解析 课业小结 平行公理 平行判定.
Relevance Theory Lecture 12. Relevance Theory 交际研究的对象是交际的概念、内容、 性质、功能、方法和交际行为、交际参 加者之间的关系等的认识和阐述。 20 世 纪 70 年代末以来, Sperber & Wilson 把认 知与交际结合起来,于 1986.
编译原理总结. 基本概念  编译器 、解释器  编译过程 、各过程的功能  编译器在程序执行过程中的作用  编译器的实现途径.
周期信号的傅里叶变换. 典型非周期信号 ( 如指数信号, 矩形信号等 ) 都是满足绝对可 积(或绝对可和)条件的能量信号,其傅里叶变换都存在, 但绝对可积(或绝对可和)条件仅是充分条件, 而不是必 要条件。引入了广义函数的概念,在允许傅里叶变换采用 冲激函数的前提下, 使许多并不满足绝对可积条件的功率.
 符号表  标识符的作用: 声明部分:定义了各种对象及对应的属性和 使用规则。 程序体:对所定义的对象进行各种操作。 $ididname IdnameAttributeIR  必要性 Token : 新表-符号表(种类、类型等信息):
习题课( 1 ) 进程管理及调度. 复习 进程概念、描述及状态 进程概念、描述及状态 进程的同步与互斥及应用 进程的同步与互斥及应用 管程机制 管程机制 进程通信 进程通信 进程调度算法 进程调度算法 进程死锁 进程死锁 线程 线程.
初中几何第三册 弦切角 授课人: 董清玲. 弦切角 一、引入新课: 什么是圆心角、圆周角、圆周角定理的内容是什么? 顶点在圆心的角叫圆心角。 顶点在圆上,并且两边都和圆相交的角叫做圆周角。 定理:一条弧所对的圆周角等于它所对的圆心角的一半。 A B′ C B O.
Department of Mathematics 第二章 解析函数 第一节 解析函数的概念 与 C-R 条件 第二节 初等解析函数 第三节 初等多值函数.
1 第 7 章 存储过程、触发器和程序包 在很多时候,都需要保存 PL/SQL 程序块,以便 随后可以重新使用。这也意味着,程序块需要一个名 称,这样需才可以调用或者引用它。命名的 PL/SQL 程序块可被独立编译并存储在数据库中,任何与数据 库相连接的应用程序都可以访问这些存储的 PL/SQL 程序块。
网上预约集港操作指南 一、登录系统 登陆下面图片显示网址:输入堆场用户名、密码和校验码登陆系统.
首 页 首 页 上一页 下一页 本讲内容本讲内容 视图,剖视图(Ⅰ) 复习: P107 ~ P115 作业: P48(6-2,6-4), P49( 去 6-6) P50, P51(6-13), P52 P50, P51(6-13), P52 P53 (6-18,6-20) P53 (6-18,6-20)
1-4 节习题课 山东省淄博第一中学 物理组 阚方海. 2 、位移公式: 1 、速度公式: v = v 0 +at 匀变速直线运动规律: 4 、平均速度: 匀变速直线运动 矢量式 要规定正方向 统一单位 五个量知道了三 个量,就能求出 其余两个量 3 、位移与速度关系:
《 UML 分析与设计》 交互概述图 授课人:唐一韬. 知 识 图 谱知 识 图 谱知 识 图 谱知 识 图 谱.
Introduction to Automatic Control The Laplace Transform Li Huifeng Tel:
1 、如果 x + 5 > 4 ,那么两边都 可得 x >- 1 2 、在- 3y >- 4 的两边都乘以 7 可得 3 、在不等式 — x≤5 的两边都乘以- 1 可得 4 、将- 7x — 6 < 8 移项可得 。 5 、将 5 + a >- 2 a 移项可得 。 6 、将- 8x < 0.
名探柯南在侦查一个特大盗窃集团过程 中,获得藏有宝物的密码箱,密码究竟 是什么呢?请看信息: ABCDEF( 每个字 母表示一个数字 ) A :是所有自然数的因数 B :既有因数 5 ,又是 5 的倍数 C :既是偶数又是质数 D :既是奇数又是合数 EF :是 2 、 3 、 5 的最小公倍数.
项目七: PLC 功能指令应用 带进位循环左移指令 XXXXX. 项目七: PLC 功能指令应用 FX2 系列可编程控制器移位控制指令有移位、循环移位、字移位 及先进先出 FIFO 指令等 10 条指令。 带进位循环右移指令 RCR 带进位循环左移指令 RCL 字右移位指令 WSFR 先入先出读出指令.
EC 营客通产品操作(九) EC 营客通产品操作(九) 400 电话 400 电话. 400 电话有助于提升企业形象,无论企业地址变更、机构 变化、人员变动,联系方式永远不变。且在 EC 上申请的 400 电话可以在 EC 平台上进行统一的 400 电话接听及 400 电话客服的管理。
§10.2 对偶空间 一、对偶空间与对偶基 二、对偶空间的有关结果 三、例题讲析.
企业产品标准信息公共服务平台 操作介绍 目录 一 、系统架构介绍 二 、企业产品标准自我声明填报系统 三 、企业产品标准公示系统.
表单自定义 “ 表单自定义 ” 功能是用于制作表单的 工具,用数飞 OA 提供的表单自定义 功能能够快速制作出内容丰富、格 式规范、美观的表单。
力的合成 力的合成 一、力的合成 二、力的平行四边形 上一页下一页 目 录 退 出. 一、力的合成 O. O. 1. 合力与分力 我们常常用 一个力来代替几个力。如果这个 力单独作用在物体上的效果与原 来几个力共同作用在物体上的效 果完全一样,那么,这一个力就 叫做那几个力的合力,而那几个 力就是这个力的分力。
荆门市总工会会员信息采集系统 操作培训 融建信息技术有限公司 肖移海 QQ群号:
逻辑设计基础 1 第 7 章 多级与(或)非门电路 逻辑设计基础 多级门电路.
感谢您的关注 联系电话: – 677 手机: QQ :
§5.6 利用希尔伯特 (Hilbert) 变换 研究系统的约束特性 希尔伯特变换的引入 可实现系统的网络函数与希尔伯特变换.
1 第三章 数列 数列的概念 考点 搜索 ●数列的概念 ●数列通项公式的求解方法 ●用函数的观点理解数列 高考 猜想 以递推数列、新情境下的 数列为载体, 重点考查数列的通 项及性质, 是近年来高考的热点, 也是考题难点之所在.
第二节. 广告牌为什么会被风吹倒? 结构的稳定性: 指结构在负载的作用下 维持其原有平衡状态的能力。 它是结构的重要性质之一。
第二节 财政的基本特征 第二节 财政的基本特征 一、财政分配以政府为主体 二、财政分配一般具有强制性 三、财政分配一般具有无偿性 第一章 财政概论 四、财政分配一般具有非营利性.
目录 上页 下页 返回 结束 二、无界函数反常积分的审敛法 * 第五节 反常积分 无穷限的反常积分 无界函数的反常积分 一、无穷限反常积分的审敛法 反常积分的审敛法  函数 第五章 第五章.
本章讨论有限自由度结构系统,在给定载荷和初始条件激励下的系统动力响应计算方法。 第 六 章
SCI 数据库检索练习参考 本练习完全依照 SCI 数据库实际检索过程而 实现。 本练习完全依照 SCI 数据库实际检索过程而 实现。 练习中,选择了可以举一反三的题目,读 者可以根据题目进行另外的检索练习,如: 可将 “ 与 ” 运算检索改为 “ 或 ” 、 “ 非 ” 运算检索 等等。 练习中,选择了可以举一反三的题目,读.
§7.2 估计量的评价标准 上一节我们看到,对于总体 X 的同一个 未知参数,由于采用的估计方法不同,可 能会产生多个不同的估计量.这就提出一 个问题,当总体的一个参数存在不同的估 计量时,究竟采用哪一个好呢?或者说怎 样评价一个估计量的统计性能呢?下面给 出几个常用的评价准则. 一.无偏性.
Presentation transcript:

第十三章 多重继承和多重替换 Multiple Inheritance and Multiple Substitutability 多重继承 — 当一个子类从一个以上的超 类型继承属性和方法 多从替代 — 不同类型的对象之间的相互 替代

多重继承 现实世界的复杂性, 由于 一个实体的多哥角色性, 在进行泛化抽象时, 常常 需要从不同角度进行。 反之, 一个实体可以从不 同继承特征, 构成多重继 承。 如图 –OT 3 继承了 OT 1 和 OT 2 的全 部特征(属性, 操作) –OT 3 是 OT 1 和 OT 2 的一个类 型扩展 –OT 3 的实例既可以替换 OT 1 实例, 也可以替换 OT 2 实例

多重继承的有向无环图 DAG 多重继承构造了一个有向 无环图,其总根为 ANY 类型的层次结构是连通的, 没有孤立子,从根可以到 达每一个类型结点,反子 亦然 类型的层次结构是无回路 的,即多重继承不支持递 归 若只有单重继承,则 DAG 转化为树 GOM 的多重继承是全继承 概念

多重继承带来的问题 ( 一 ) 操作 OP 的歧义 -- 操作冲突 冲突原因: – 一个 op 名字分别在不同父类 ( 祖先 )OT 1, OT 2 中说明, 操作体不同, 则造成子类 OT 3 在全继 承情况下, op 操作名的二义性。 – 若 op 在共同的祖先, 如 OT 0 中被定义, 但在不 同的父类型如 OT 1, OT 2 中被分别重定义, 从 而造成在 OT 3 中的二义性。

操作二义性举例 一个操作 bonus( 奖励 ) 分别在 Student 和 Employee 有定义, 当一个奖励作用在 ” TA ” 上时, 究竟应当怎 么处理呢?

declare bonus : Student || float declare bonus : Employee -> void ||float-> void code bonusForStudents; code bonusForEmps; define bonusForStudents(gpaInc) is bonusForEmps(salInc) is self.gpa := self.gpa * gpaInc; self.salary := self.salary * salInc; ; 增加一个百分点的 GPA ; 增加一个百分点的 Salary

var 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);!! 不会产生二义性

多重继承的操作冲突解决方案 注意:为了兼容已有程序, 不能通过修改 超类中的操作名来解决问题 解决冲突的方法 – 定义优选权, 允许用户指定继承的优先权 – 用户通过对 Supertype 子句中超类型队列来 指定优先权 type OT supertypes OT 1, …, OT n is

方法 (1) 实现选择 op 的方法 : –A: 首先确定 op 是否在本类型中被定义 –B: 按 DAG 图, 从优先队列中每一个超类开始, 向上扫描每个枝条直到根, 顺序检查 op 名称, 首先被遇到的 op 被选中

解决冲突之方法二 -- 显式重命名 对所继承的同名的操作, 分别在当前子类型中重 新命名 虽然操作 op 的名字在超类中不能修改, 但在当前 子类中可以用重命名来代替, 不会影响兼容性。 Type OT Supertypes OT 1 (renames op to op 1 ) … OT m-1 (renames op to op m-1 ) OT m, is …

解决冲突方法三 — 重定义操作 对 op 进行重新精化有两种选择: –A: 在当前子类型 OT 3 中重新定义 op 操作 –B: 在 OT 3 中指定凡遇到 op 操作实际上将与哪一个超类的 op 捆绑。 define type OT 3 supertypes OT 1,OT 2 is … operations refine op … implementation define op … self. OT 1 $op( … );!! 执行 OT 1 中定义 op 方法 end type OT 3 ;

多重继承带来的冲突二 -- 类型冲突 类型冲突是更严重的且目前无法消解的 问题 –(1) 属性类型冲突 : 从不同的父类分别继承了 一个同名但类型不同的属性 如 OT 1.A 与 OT 2.A 类型不相容 在 OT 3 中对同名不相容的属性错误无法在静态编 译时被检查出, 只有在运行时才能出现。

– ( 2 )操作类型冲突 从不同的父类分别继承了一个同名但返回类型不同的操作。 Delcare f : OT 1 || … - > T 1 Delcare f : OT 2 || … - > T 2 对于一个具有 OT 2 类型的变量 O 2 有一个引用 链 :O 2.f( … ).q( … ), 即函数 q 将由一个 T 2 类型的实例引用。 而函数程序运行时, 当 O 2 指向一个 OT 3 实例时,函数 f 根据 优先队列解决方法将选择 OT 1 的方法,其返回一个 T 1 类型 实例 -- 与 q 所要求的相冲突。

类型冲突示例 — 关于方法 Skill Student 类型的 Skill 返回一个浮点值 float Employee 类型的 Skill 返回的一个字符串 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: 商品对象的使用特征 -- 类别, 规格, 型号, 产地, 品牌 … 可以逐层抽象 –B: 商品对象的价值特征 -- 进价, 售价, 利润, 成本, 供货商, 合同 … 也可以从财务处理角度进行管理

多重替换 多重替换是针对某些多重继承不能清楚 处理的情况下而采用的另外一种支持多 角色实体建模的方法 多重继承的局限性: – 继承使类型间互相矛盾, 全继承使类型的属性 集合杂乱无章 – 继承可能导致冲突

示例 — 瑞士军刀 瑞士军刀有多个部件, 小刀, 剪刀, 钻,等 瑞士军刀可以以它的某一部件的身份出现 如瑞士军刀是一把小刀; 瑞士军刀是一把剪子; 瑞士军刀是一把钻子 等等 瑞士军刀的每一个部件可以单独使用, 其作用功 能完全独立, 如一把剪刀, 一把小刀 …

建模分析 用多重继承概念建模 – 第一步:超类模型 Blade,Knife,Material,ScissorBlade,Scissor 均有一个 canCut 操作 – 第二步:瑞士军刀建模: type SwissKnife supertypes Knife, Scissor is; … !! 见下面的讨论 end type SwissKnife; 若采用多重继承方法,缺点为 (1) 属性杂乱无 章,(2) 方法 canCut 重复定义,(3) 瑞士军刀的某个 部件不能作为一个单独对象来使用

多重替换建模方法 以瑞士军刀为例 type SwissKnife Supertype Knife is body [ 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.create; sk.create; … k := sk; s := sk; sk.canCut(p); k.canCut(p); s.canCut(p);

代表 (representation) 问题 替换概念也可以灵活的应用在两个类型 之间 代表问题示例 – 当总公司召集各部门开会时,其关键在于, 要求各部门派一个代表,而并不指定必须是 谁 – 部门在开会这种特定条件下,其行为就像一 个雇员,例如,一个部门可以插入到会议代 表的雇员集合中 – 部门内部需要定义一个 “ 代表 ” 操作,一旦需 要一个代表时,该操作可以产生一个具体的 雇员

部门和雇员两个类型的替换 类型定义 type Department supertype ANY is body [ members : {Employee}; manager : Manager; ]; fashion Employee using self.representative; operations declare representative : -> Employee; … implementation define representative is return self.manager; … end type Department;

部门和雇员两个类型的替换 引用的替换 var meetingParticipants : EmployeeSet; developmentDep : Department; bigBoss : Manager; someEmp : Employee; … meetingParticipants.insert(bigBoss); !! no meeting without him meetingParticipants.insert(developmentDep); !! they will send a representation foreach (emp in meetingParticipants) print (emp.name);