第六章面向对象的软件工程 复习要求 1.了解面向对象的概念,包括什么是范型,面向对象的概念,对象和对象的分类等 2.了解用面向对象方法构造软件的开发过程,包括应用生存期和类生存期的概念 3.了解面向对象分析方法,包括论域分析,应用分析的介绍 4.了解面向对象设计方法,包括高层设计模型和设计原则,类设计的目标和方针,复用 设计及类设计的方法 5.了解有影响的coad方法、 Booch方法和OMI方法的基本思想。 二、内容提要 面向对象技术是一个非常实用而强有力的软件开发方法。它的特征是: 方法的唯一性,即方法是对软件开发过程所有阶段进行综合考虑而得到的。 从生存期的一个阶段到下一个阶段的高度连续性,即生存期后一阶段的成果只是在前 一阶段成果的补充和修改 把面向对象分析(OOA)、面向对象设计(OOD)和面向对象程序设计(OOP)集成到生存 期的相应阶段 1.面向对象的概念 (1)范型 范型( Paradigm)又称为范例、风范或模式( Pattern)。从软件开发角度来看,范型与问题 解决技术有关。范型定义了特定的问题和应用的开发过程中将要遵循的步骤,确定将用于表 示问题和它的解决的那些成分的类型,并利用这些成分表示与问题解决有关的抽象,直接得 到问题的结构。因此,范型的选择影响整个软件开发生存期。就是说,它支配了设计方法、 编码语言、测试和检验技术的选择。 ①流行的范型:目前流行多种范型,它们提供了许多方法,可进行系统分解。流行的 范型有:过程性的,逻辑的,面向存取的,面向进程的,面向对象的,函数型的,说明性的。 每个范型都有它的支持者和用户,每个范型都特别适合于某种类型的问题或子问题。例如, 逻辑程序设计范型是基于规则的,它把有关问题的知识分解成一组具体规则,用语言的 “ if then”等结构来表示这些规则。面向存取范型是一种在构造用户界面方面很有用的技术 此外,每一个范型都用不同的方式考虑问题,每一个范型都使用不同的方法来分解问题,而 且每一个范型都导致不同种类的块、过程、产生规则。下面主要讨论三种范型。研究的目的 是帮助我们找到解决问题的入手点。 ②过程性范型:过程性范型是使用最广泛、历史最长的软件范型。它产生过程的抽象, 这些抽象把软件视为处理流,并定义成由一系列步骤构成的算法。每一步骤都是带有预定输 入和特定输出的一个过程,把这些步骤串联在一起可产生合理的稳定的贯通于整个程序的控 制流,最终产生一个简单的具有静态结构的体系结构,如图6.1(a)所示。 过程性范型侧重建立构成问题解决的处理流,数据抽象、数据结构是根据算法步骤的要
1 第六章 面向对象的软件工程 一、复习要求 1. 了解面向对象的概念,包括什么是范型,面向对象的概念,对象和对象的分类等。 2. 了解用面向对象方法构造软件的开发过程,包括应用生存期和类生存期的概念。 3. 了解面向对象分析方法,包括论域分析,应用分析的介绍。 4. 了解面向对象设计方法,包括高层设计模型和设计原则,类设计的目标和方针,复用 设计及类设计的方法。 5. 了解有影响的 coad 方法、Booch 方法和 OMT 方法的基本思想。 二、内容提要 面向对象技术是一个非常实用而强有力的软件开发方法。它的特征是: ▪ 方法的唯一性,即方法是对软件开发过程所有阶段进行综合考虑而得到的。 ▪ 从生存期的一个阶段到下一个阶段的高度连续性,即生存期后一阶段的成果只是在前 一阶段成果的补充和修改。 ▪ 把面向对象分析(OOA)、面向对象设计(OOD)和面向对象程序设计(OOP)集成到生存 期的相应阶段。 1. 面向对象的概念 (1) 范型 范型(Paradigm)又称为范例、风范或模式(Pattern)。从软件开发角度来看,范型与问题 解决技术有关。范型定义了特定的问题和应用的开发过程中将要遵循的步骤,确定将用于表 示问题和它的解决的那些成分的类型,并利用这些成分表示与问题解决有关的抽象,直接得 到问题的结构。因此,范型的选择影响整个软件开发生存期。就是说,它支配了设计方法、 编码语言、测试和检验技术的选择。 ① 流行的范型 :目前流行多种范型,它们提供了许多方法,可进行系统分解。流行的 范型有:过程性的,逻辑的,面向存取的,面向进程的,面向对象的,函数型的,说明性的。 每个范型都有它的支持者和用户,每个范型都特别适合于某种类型的问题或子问题。例如, 逻辑程序设计范型是基于规则的,它把有关问题的知识分解成一组具体规则,用语言的 “if_then”等结构来表示这些规则。面向存取范型是一种在构造用户界面方面很有用的技术。 此外,每一个范型都用不同的方式考虑问题,每一个范型都使用不同的方法来分解问题,而 且每一个范型都导致不同种类的块、过程、产生规则。下面主要讨论三种范型。研究的目的 是帮助我们找到解决问题的入手点。 ② 过程性范型 :过程性范型是使用最广泛、历史最长的软件范型。它产生过程的抽象, 这些抽象把软件视为处理流,并定义成由一系列步骤构成的算法。每一步骤都是带有预定输 入和特定输出的一个过程,把这些步骤串联在一起可产生合理的稳定的贯通于整个程序的控 制流,最终产生一个简单的具有静态结构的体系结构,如图 6.1(a)所示。 过程性范型侧重建立构成问题解决的处理流,数据抽象、数据结构是根据算法步骤的要
求开发的,它贯穿于过程,提供过程所要求操作的信息。系统的状态是一组全局变量,这组 全局变量保存状态的值,把它们从一个过程传送到另一个过程 过程性范型是一种成熟的应用开发过程。对这种方法已有许多支持工具。然而,在大型 系统的开发上存在一些问题。 ③面向对象范型:在过程性范型中优先考虑的是过程抽象,而在面向对象范型中优先 考虑的是实体,即问题论域的对象。在面向对象范型中,把标识和模型化问题论域中的主要 实体做为系统开发的起点,主要考虑对象的行为而不是必须执行的一系列动作。 面向对象系统中的对象是数据抽象与过程抽象的综合。系统的状态保存在各个数据抽象 的核心所定义的数据存储中。控制流包含在各个数据抽象中的操作内。不像在过程性范型里 那样,把数据从一个过程传送到另一个过程,而是把控制流从一个数据抽象通过消息传送到 另一个数据抽象。完成的系统体系结构更复杂但也更灵活,如图6.2(b)所示。把控制流分离 成块,这样可以把复杂的动作视为各个局部间的相互作用。 过程性系统 初始化读入计算}写出結束 (a)系统结构基于要执行的任务,改变一个可能需要改变其它所有的 面向对象的系统 (b)系统结构基于对象间的交互,改变一个通常只具有局部影响 图6.1过程性系统和面向对象系统的基本构造 ④面向进程的范型:面向进程的范型是把一个问题分解成独立执行的模块。让不只 个程序同时运行。这些进程互相配合,解决问题。面向进程范型产生的主要的块是进程。 个进程中的活动独立于其它进程的活动,但可以要求从其它进程得到信息,或为其它进程提 供信息。甚至可以异步处理,仅需要进程暂停发送或接收信息。在面向对象范型中,各个对 象是相对独立的,但也存在单线索(单线程)控制。面向进程范型支持与面向对象范型相同的 封装,但可提供多线索(多线程)执行。 ⑤混合范型:在大型系统的开发中,很难说哪种范型对整个问题的解决最好。系统开 发现在有一种补充步骤,可把大型问题分解成 一组子问题。对于每个子问题可以采用适当的 软件范型。例如,设计一个智能数据分析系统 用户界面 (面向存取范型) 时,可把它分解为4个子系统,如图62所示 系统的数据库界面,可以使用面向对象的方法 知识库 分析算法 进行设计;智能数据分析用逻辑范型设计;而 (逻辑范型)(过程性范型) 分析算法则是过程性的;系统通过一个用户界 数据库界面 面来实用化,这个用户界面是用面向存取范型 (面向对象范型) 设计出来的 这种设计需要有某种实现语言或一组协 图62一个智能数据分析系统
2 图 6.2 一个智能数据分析系统 求开发的,它贯穿于过程,提供过程所要求操作的信息。系统的状态是一组全局变量,这组 全局变量保存状态的值,把它们从一个过程传送到另一个过程。 过程性范型是一种成熟的应用开发过程。对这种方法已有许多支持工具。然而,在大型 系统的开发上存在一些问题。 ③ 面向对象范型 :在过程性范型中优先考虑的是过程抽象,而在面向对象范型中优先 考虑的是实体,即问题论域的对象。在面向对象范型中,把标识和模型化问题论域中的主要 实体做为系统开发的起点,主要考虑对象的行为而不是必须执行的一系列动作。 面向对象系统中的对象是数据抽象与过程抽象的综合。系统的状态保存在各个数据抽象 的核心所定义的数据存储中。控制流包含在各个数据抽象中的操作内。不像在过程性范型里 那样,把数据从一个过程传送到另一个过程,而是把控制流从一个数据抽象通过消息传送到 另一个数据抽象。完成的系统体系结构更复杂但也更灵活,如图 6.2(b)所示。把控制流分离 成块,这样可以把复杂的动作视为各个局部间的相互作用。 图 6.1 过程性系统和面向对象系统的基本构造 ④ 面向进程的范型 :面向进程的范型是把一个问题分解成独立执行的模块。让不只一 个程序同时运行。这些进程互相配合,解决问题。面向进程范型产生的主要的块是进程。一 个进程中的活动独立于其它进程的活动,但可以要求从其它进程得到信息,或为其它进程提 供信息。甚至可以异步处理,仅需要进程暂停发送或接收信息。在面向对象范型中,各个对 象是相对独立的,但也存在单线索(单线程)控制。面向进程范型支持与面向对象范型相同的 封装,但可提供多线索(多线程)执行。 ⑤ 混合范型 :在大型系统的开发中,很难说哪种范型对整个问题的解决最好。系统开 发现在有一种补充步骤,可把大型问题分解成 一组子问题。对于每个子问题可以采用适当的 软件范型。例如,设计一个智能数据分析系统 时,可把它分解为 4 个子系统,如图 6.2 所示。 系统的数据库界面,可以使用面向对象的方法 进行设计;智能数据分析用逻辑范型设计;而 分析算法则是过程性的;系统通过一个用户界 面来实用化,这个用户界面是用面向存取范型 设计出来的。 这种设计需要有某种实现语言或一组协
同语言的支持。许多流行的功能不断增强的语言支持不只一种设计范型。对于混合范型,现 在已经存在不少技术。像C++和并发C这样的语言都是多范型语言,支持过程性范型和面向 对象范型。并发C还支持面向进程范型。系统可以使用单一的语言,利用两种或多种范型写 成。还可以利用可共享数据格式和连接规约的某些语言,把用这些语言分别编写的块链接到 某个单一的应用中去。 (2)面向对象的概念 关于“面向对象”,有许多不同的看法。Coad和 Yourdon给出了一个定义:“面向对 象=对象+类+继承+消息通信”。如果一个软件系统是使用这样4个概念设计和实现 的,则认为这个软件系统是面向对象的。一个面向对象的程序的每一成份应是对象,计算是 通过新的对象的建立和对象之间的消息通信来执行的。 (3)对象( object 般意义来讲,对象是现实世界中存在的一个事物。可以是物理的,如一个家具或桌子 如图6.3所示,可以是概念上的,如一个开发项目。 对象是构成现实世界的一个独立的单位,具有自己的 家具 桌子 静态特征(用数据描述)和动态特征(行为或具有的功 属性 价格 价格 虍)。例如:人的特征:姓名、性别、年龄等,行为: 尺寸 尺寸 衣、食、住、行等。 ①对象、属性、操作、消息定义 位置 位置 对象可以定义为系统中用来描述客观事物的 个实体,它是构成系统的一个基本单位,由一组属性 购买 购买 和一组对属性进行操作的服务组成 销 属性一般只能通过执行对象的操作来改变。 称重 移动 操作又称为方法或服务,在C++中称为成员函 移动 数,它描述了对象执行的功能,若通过消息传递,还 图6.3对象的定义 可以为其它对象使用。 而所谓的消息是一个对象与另一个对象的通信单元,是要求某个对象执行类中定义的某 个操作的规格说明。发送给一个对象的消息定义了一个操作名和一个参数表(可能是空的), 并指定某一个对象。由一个对象接收的消息则调用消息中指定的操作,并将传递过来的实际 参数与参数表中相应的形式参数结合起来接收对象对消息的处理可能会改变对象中的状态 即改变接收对象的属性,并发送一个消息给自己或另一个对象。可以认为,这种消息的传递 大致等价于过程性范型中的函数调用 ②对象的分类 外部实体:与软件系统交换信息的外部设备、相关子系统、操作员或用户等。 信息结构:问题信息域中的概念实体,如信号、报表、显示信息等 需要记忆的事件:在系统运行过程中可能产生并需要系统记忆的事件,如单击鼠标左 键、击打键盘“”键等 角色:与软件系统交互的人员所扮演的角色,如经理、部长、技术支持等 组织机构:有关机构,如单位、小组等。 位置:作为系统环境或问题上下文的场所、位置,如客户地址、收件人(机构)地址等 操作规程:如操作菜单、某种数据输入过程等。 在标识对象时必需注意遵循“信息隐蔽”的原则:必需将对象的属性隐藏在对象的内部, 使得从对象的外部看不到对象的信息是如何定义的,只能通过该对象界面上的操作来使用这 些信息。对象的状态通过给对象赋予具体的属性值而得到。它只能通过该对象的操作来改变 对象有两个视图,分别表现在分析设计和实现方面。从分析及设计方面来看,对象表示
3 图 6.3 对象的定义 同语言的支持。许多流行的功能不断增强的语言支持不只一种设计范型。对于混合范型,现 在已经存在不少技术。像 C++和并发 C 这样的语言都是多范型语言,支持过程性范型和面向 对象范型。并发 C 还支持面向进程范型。系统可以使用单一的语言,利用两种或多种范型写 成。还可以利用可共享数据格式和连接规约的某些语言,把用这些语言分别编写的块链接到 某个单一的应用中去。 (2) 面向对象的概念 关于“面向对象”,有许多不同的看法。Coad 和 Yourdon 给出了一个定义:“面向对 象 = 对象 + 类 + 继承 + 消息通信”。如果一个软件系统是使用这样 4 个概念设计和实现 的,则认为这个软件系统是面向对象的。一个面向对象的程序的每一成份应是对象,计算是 通过新的对象的建立和对象之间的消息通信来执行的。 (3) 对象(object) 一般意义来讲,对象是现实世界中存在的一个事物。可以是物理的,如一个家具或桌子, 如图 6.3 所示,可以是概念上的,如一个开发项目。 对象是构成现实世界的一个独立的单位,具有自己的 静态特征(用数据描述)和动态特征(行为或具有的功 能)。 例如:人的特征:姓名、性别、年龄等,行为: 衣、食、住、行等。 ① 对象、属性、操作、消息定义 对象可以定义为系统中用来描述客观事物的一 个实体,它是构成系统的一个基本单位,由一组属性 和一组对属性进行操作的服务组成。 属性一般只能通过执行对象的操作来改变。 操作又称为方法或服务,在 C++中称为成员函 数,它描述了对象执行的功能,若通过消息传递,还 可以为其它对象使用。 而所谓的消息是一个对象与另一个对象的通信单元,是要求某个对象执行类中定义的某 个操作的规格说明。发送给一个对象的消息定义了一个操作名和一个参数表(可能是空的), 并指定某一个对象。由一个对象接收的消息则调用消息中指定的操作,并将传递过来的实际 参数与参数表中相应的形式参数结合起来。接收对象对消息的处理可能会改变对象中的状态, 即改变接收对象的属性,并发送一个消息给自己或另一个对象。可以认为,这种消息的传递 大致等价于过程性范型中的函数调用。 ② 对象的分类 ▪ 外部实体:与软件系统交换信息的外部设备、相关子系统、操作员或用户等。 ▪ 信息结构:问题信息域中的概念实体,如信号、报表、显示信息等。 ▪ 需要记忆的事件:在系统运行过程中可能产生并需要系统记忆的事件,如单击鼠标左 键、击打键盘“→”键等。 ▪ 角色:与软件系统交互的人员所扮演的角色,如经理、部长、技术支持等。 ▪ 组织机构:有关机构,如单位、小组等。 ▪ 位置:作为系统环境或问题上下文的场所、位置,如客户地址、收件人(机构)地址等。 ▪ 操作规程:如操作菜单、某种数据输入过程等。 在标识对象时必需注意遵循“信息隐蔽”的原则:必需将对象的属性隐藏在对象的内部, 使得从对象的外部看不到对象的信息是如何定义的,只能通过该对象界面上的操作来使用这 些信息。对象的状态通过给对象赋予具体的属性值而得到。它只能通过该对象的操作来改变。 对象有两个视图,分别表现在分析设计和实现方面。从分析及设计方面来看,对象表示 家具 价格 尺寸 重量 位置 颜色 属性 服务 购买 销售 称重 移动 桌子 价格 尺寸 重量 位置 颜色 购买 销售 称重 移动 属性 服务
了一种概念,它们把有关的现实世界的实体模型化。从实现方面来看,一个对象表示了在应 用程序中出现的实体的实际数据结构。之所以有两个视图,是为了把说明与实现分离,对数 据结构和相关操作的实现进行封装 (4)类( class和实例( Instance) 把具有相同特征和行为的对象归在一起就形成了类。类成为某些对象的模板,抽象地描 述了属于该类的全部对象的属性和操作。属于某个类的对象叫做该类的实例。对象的状态则 包含在它的实例变量,即实例的属性中。如图64所示。从“李杰”、“王辉”和“杨芳” 等对象可得到类“学生”,而这些对象就称为该类的实例 类定义了各个实例所共有的结构,类的每一个实例都可以使用类中定义的操作。实例的 当前状态是由实例所执行的操作定义的。 李杰 王辉 属性 李杰 王辉 杨芳 姓名 女 性别 广东 湖南 北京 籍贯 软件 计算机控制 系统结构 专业 19804 1979.1 1979.1 出生年月 9#楼129室 9#楼320室 5#楼418室 住址 服 服 看书 看书 看书 看书 实验 实验 运动 运动 运动 图64对象、类与实例 面向对象程序设计语言,如C++和 smalltalk都定义了一个new操作,可建立一个类的 新实例。C++还引入了构造函数,用它在声明一个对象时建立实例。此外,程序设计语言给 出了不同的方法,来撤消(称为析构)实例,即当某些对象不再使用时把它们删去,把存储释 放以备其它对象使用。C++给出了一个操作 delete,可以释放一个对象所用的空间。C++还允 许每个类定义自己的析构方法,在撤消一个对象时调用它。 smalltalk没有提供一个机制来撤 消对象,但可以进行无用单元收集。 类常常可看做是一个抽象数据类型(ADT)的实现。但更重要的是把类看做是表示某种概 念的一个模型。事实上,类是单个的语义单元,它可以很自然地管理系统中的对象,匹配数 据定义与操作。类加进了操作,给通常的记录赋予了语义,可提供各种级别的可访问性 (5)继承( inheritance) 如果某几个类之间具有共性的东西(信息结构和行为),抽取出来放在一个一般类中,而 将各个类的特有的东西放在特殊类中分别描述,则可建立起特殊类对一般类的继承。如图6.5 所示,。各个特殊类可以从一般类中继承共性,这样避免了重复 汽车 轿车 起重 图6.5特殊类对一般类的继承关系
4 了一种概念,它们把有关的现实世界的实体模型化。从实现方面来看,一个对象表示了在应 用程序中出现的实体的实际数据结构。之所以有两个视图,是为了把说明与实现分离,对数 据结构和相关操作的实现进行封装。 (4) 类(class)和实例(instance) 把具有相同特征和行为的对象归在一起就形成了类。类成为某些对象的模板,抽象地描 述了属于该类的全部对象的属性和操作。属于某个类的对象叫做该类的实例。对象的状态则 包含在它的实例变量,即实例的属性中。如图 6.4 所示。从“李杰”、“王辉”和“杨芳” 等对象可得到类“学生”,而这些对象就称为该类的实例。 类定义了各个实例所共有的结构,类的每一个实例都可以使用类中定义的操作。实例的 当前状态是由实例所执行的操作定义的。 图 6.4 对象、类与实例 面向对象程序设计语言,如 C++和 smalltalk 都定义了一个 new 操作,可建立一个类的 新实例。C++还引入了构造函数,用它在声明一个对象时建立实例。此外,程序设计语言给 出了不同的方法,来撤消(称为析构)实例,即当某些对象不再使用时把它们删去,把存储释 放以备其它对象使用。C++给出了一个操作 delete,可以释放一个对象所用的空间。C++还允 许每个类定义自己的析构方法,在撤消一个对象时调用它。smalltalk 没有提供一个机制来撤 消对象,但可以进行无用单元收集。 类常常可看做是一个抽象数据类型(ADT)的实现。但更重要的是把类看做是表示某种概 念的一个模型。事实上,类是单个的语义单元,它可以很自然地管理系统中的对象,匹配数 据定义与操作。类加进了操作,给通常的记录赋予了语义,可提供各种级别的可访问性。 (5) 继承 (inheritance) 如果某几个类之间具有共性的东西(信息结构和行为),抽取出来放在一个一般类中,而 将各个类的特有的东西放在特殊类中分别描述,则可建立起特殊类对一般类的继承。如图 6.5 所示,。各个特殊类可以从一般类中继承共性,这样避免了重复。 图 6.5 特殊类对一般类的继承关系 李杰 李杰 男 广东 软件 1980.4 9#楼129室 看书 实验 上课 运动 杨芳 服务 王辉 男 湖南 计算机控制 1979.1 9#楼320室 杨芳 女 北京 系统结构 1979.12 5#楼418室 姓名 性别 籍贯 专业 出生年月 住址 学生 属性 王辉 属性 属性 属性 看书 实验 上课 运动 服务 看书 实验 上课 运动 服务 看书 实验 上课 运动 服务 汽车 大轿车 运货车 救火车 起重车
建立继承结构的好处 易编程、易理解代码短,结构清晰 易修改:共同部分只要在一处修改即可 退休者 易增加新类:只须描述不同部分。 (6)多继承 如果一个类需要用到多个既存类的特征,可以从 多个类中继承,称为多继承。例如退休教师是继承退 休者和教师这两个类的某些特征或行为而得到的一个 新类。 图66多继承 (7)多态性和动态绑定 对象互相通信,即一个对象发消息给另一个对象,执行某些行为或又发消息给另外的对 象,从而执行系统的功能 发送消息的对象可能不知道另一个对象的类型是什么。如在C程序中使用命令 Clearlnt() 时要严格区分该命令适合一个整数,还是一个整数数组。但在C++情形, ClearIng()对两者 都适用,它自己判断对象是哪一个 这就是多态性。它意味着一个操作在不同类中可以有不同的实现方式。如清零操作 ClearInt()针对消息对象是 Int array还是nt,其实现是不同的。在一个面向对象的多态性 语言中,可能代替一个特定类型的类型的集合就是它的子类集合 例如,图67给出了4个类的继承层次。使用这个继承结构,发送给多边形类的所有消 息,它的所有子类都能够响应。又例如,想要在屏幕上画一系列多边形,多态性允许一个表 的元素可以属于一组指定的类型而不仅仅是 个类型,可以认为这是一个类族。通过遍 多边形 历这个表,发送给各个表元素以draw消息 画出所有的多边形 动态绑定把函数调用与目标代码块的连 三角形 四边形 接延迟到运行时进行。这样,只有发送消息 时才与接收消息实例的一个操作绑定。它与 多态性可以使我们建立的系统更灵活,易于 扩充。做为动态绑定的例子,考虑在多边形 类中的方法 contains?( aPoint)。这个操作可以 图674个类的继承层次 在类层次的各层重新实现,以有效利用各个 子类的特殊的特征。例如,假定一个矩形有某些边与屏幕的边平行,这时,检查一个点是否 包含在矩形内,比检查一个点是否在一个一般的四边形内的效率要高一些 2.面向对象软件的开发过程 面向对象范型不仅是一些具体的软件开发技术与策略,而且是一整套关于如何看待软件 系统与现实世界的关系以及如何进行系统构造的软件方法学。用面向对象开发方法构造的软 件具有以下特点 ·面向对象的技术建立的模型与客观世界一致,因而便于理解: 适应变化的需要,修改局限在模块中; 可复用性 (1)应用生存期 图68给出应用生存期模型。在图中各个阶段的顺序是线性的,但实际上开发过程不是
5 图 6.7 4 个类的继承层次 图 6.6 多继承 建立继承结构的好处: ▪ 易编程、易理解 代码短, 结构清晰; ▪ 易修改:共同部分只要在一处修改即可; ▪ 易增加新类:只须描述不同部分。 (6) 多继承 如果一个类需要用到多个既存类的特征,可以从 多个类中继承,称为多继承。例如退休教师是继承退 休者和教师这两个类的某些特征或行为而得到的一个 新类。 (7) 多态性和动态绑定 对象互相通信,即一个对象发消息给另一个对象,执行某些行为或又发消息给另外的对 象,从而执行系统的功能。 发送消息的对象可能不知道另一个对象的类型是什么。如在 C 程序中使用命令 ClearInt ( ) 时要严格区分该命令适合一个整数,还是一个整数数组。但在 C++情形,ClearInt ( ) 对两者 都适用,它自己判断对象是哪一个。 这就是多态性。它意味着一个操作在不同类中可以有不同的实现方式。如清零操作 ClearInt ( ) 针对消息对象是 int array 还是 int,其实现是不同的。在一个面向对象的多态性 语言中,可能代替一个特定类型的类型的集合就是它的子类集合。 例如,图 6.7 给出了 4 个类的继承层次。使用这个继承结构,发送给多边形类的所有消 息,它的所有子类都能够响应。又例如,想要在屏幕上画一系列多边形,多态性允许一个表 的元素可以属于一组指定的类型而不仅仅是 一个类型,可以认为这是一个类族。通过遍 历这个表,发送给各个表元素以 draw 消息, 画出所有的多边形。 动态绑定把函数调用与目标代码块的连 接延迟到运行时进行。这样,只有发送消息 时才与接收消息实例的一个操作绑定。它与 多态性可以使我们建立的系统更灵活,易于 扩充。做为动态绑定的例子,考虑在多边形 类中的方法 contains? (aPoint)。这个操作可以 在类层次的各层重新实现,以有效利用各个 子类的特殊的特征。例如,假定一个矩形有某些边与屏幕的边平行,这时,检查一个点是否 包含在矩形内,比检查一个点是否在一个一般的四边形内的效率要高一些。 2. 面向对象软件的开发过程 面向对象范型不仅是一些具体的软件开发技术与策略,而且是一整套关于如何看待软件 系统与现实世界的关系以及如何进行系统构造的软件方法学。用面向对象开发方法构造的软 件具有以下特点: ▪ 面向对象的技术建立的模型与客观世界一致,因而便于理解; ▪ 适应变化的需要,修改局限在模块中; ▪ 可复用性。 (1) 应用生存期 图 6.8 给出应用生存期模型。在图中各个阶段的顺序是线性的,但实际上开发过程不是 教师 退休者 退休教师 多边形 四边形 矩形 三角形