面向对象软件工程实践指南 式等。 程序库是代码复用的最直接的例子。有很多的函数或者模块是软件之间都通用的,比如 说对一个数组的排序函数,文件的读、写函数等。将这些函数、模块封装在一个程序库 中,后续进行开发工作的程序员只需要简单地进行调用就可以了。程序库的好处是显而 易见的:程序员通过调用相应函数或模块,可以提高开发的效率;同时,程序库中的操 作一定是经过充分测试后正确的代码,减少了出错的可能。 ·类库是面向对象软件开发时实现复用的有效方式。将普遍需要的类放入类库,在软件开 发时可以直接使用这些类来创建对象,或者通过继承这些类并加以修改和扩充产生所需 要的子类。 ·软件服务:随着互联网、Web服务、Web API、云计算等技术的发展,在开发过程中可 以直接利用由服务提供商提供的服务或者API来构建系统,而无需了解实现服务的具 体代码和服务运行的具体方式。 ·软件开发者可以采用第三方的应用程序或应用框架实现代码的复用。这种代码复用往往 范围比较大,可以很大程度地提高开发效率。 设计模式是许多年软件开发的经验的结晶,它对各类问题提供了一些具有普遍借鉴意义 的解决方法。因而设计模式的重用实际上代表了一种知识的重用。 1.3传统软件工程 目前使用得最广泛的软件工程方法学,分别是传统软件工程和现代软件工程。传统软 件工程,主要指的是生命周期方法下的软件工程,是20世纪60年代为摆脱“软件危机”出 现的工程学。它采用结构化技术来完成软件开发的各项任务,并使用适当的软件工具或软件 工程环境来支持结构化技术的运用。该方法把软件生命周期的全过程依次划分为需求分析, 总体设计与详细设计,编码,测试,维护等几个主要阶段,然后顺序地完成每个阶段的任务。 每个阶段的开始和结束都有严格的标准,必须经过正式严格的技术审查和管理审查,前一阶 段的结束标准就是后一个阶段的开始标准。其中,审查最主要的标准就是每个阶段都应该提 交“最新的”高质量的文档。 1.需求分析 该阶段的主要工作是对待开发软件提出的需求进行分析并给出详细的定义。该阶段的 输出为软件需求说明书及初步的系统用户手册。 2.总体设计 以需求分析为结果,设计出总体的系统构架。包括模块的划分,数据传送与共享等内 容。该阶段的输出为概要设计说明书。 3.详细设计 在总体设计的基础上,设计模块内部的结构,包括界面设计、算法设计、数据库的设 计等。该阶段的输出为详细设计说明书。 4.编码 将设计模型映射为代码,用代码来实现设计的功能。利用编程语言,将人类的思想转
面向对象软件工程实践指南 7 式等。 程序库是代码复用的最直接的例子。有很多的函数或者模块是软件之间都通用的,比如 说对一个数组的排序函数,文件的读、写函数等。将这些函数、模块封装在一个程序库 中,后续进行开发工作的程序员只需要简单地进行调用就可以了。程序库的好处是显而 易见的:程序员通过调用相应函数或模块,可以提高开发的效率;同时,程序库中的操 作一定是经过充分测试后正确的代码,减少了出错的可能。 类库是面向对象软件开发时实现复用的有效方式。将普遍需要的类放入类库,在软件开 发时可以直接使用这些类来创建对象,或者通过继承这些类并加以修改和扩充产生所需 要的子类。 软件服务:随着互联网、Web 服务、Web API、云计算等技术的发展,在开发过程中可 以直接利用由服务提供商提供的服务或者 API 来构建系统,而无需了解实现服务的具 体代码和服务运行的具体方式。 软件开发者可以采用第三方的应用程序或应用框架实现代码的复用。这种代码复用往往 范围比较大,可以很大程度地提高开发效率。 设计模式是许多年软件开发的经验的结晶,它对各类问题提供了一些具有普遍借鉴意义 的解决方法。因而设计模式的重用实际上代表了一种知识的重用。 1.3 传统软件工程 目前使用得最广泛的软件工程方法学,分别是传统软件工程和现代软件工程。传统软 件工程,主要指的是生命周期方法下的软件工程,是 20 世纪 60 年代为摆脱“软件危机”出 现的工程学。它采用结构化技术来完成软件开发的各项任务,并使用适当的软件工具或软件 工程环境来支持结构化技术的运用。该方法把软件生命周期的全过程依次划分为需求分析, 总体设计与详细设计,编码,测试,维护等几个主要阶段,然后顺序地完成每个阶段的任务。 每个阶段的开始和结束都有严格的标准,必须经过正式严格的技术审查和管理审查,前一阶 段的结束标准就是后一个阶段的开始标准。其中,审查最主要的标准就是每个阶段都应该提 交“最新的”高质量的文档。 1.需求分析 该阶段的主要工作是对待开发软件提出的需求进行分析并给出详细的定义。该阶段的 输出为软件需求说明书及初步的系统用户手册。 2.总体设计 以需求分析为结果,设计出总体的系统构架。包括模块的划分,数据传送与共享等内 容。该阶段的输出为概要设计说明书。 3.详细设计 在总体设计的基础上,设计模块内部的结构,包括界面设计、算法设计、数据库的设 计等。该阶段的输出为详细设计说明书。 4.编码 将设计模型映射为代码,用代码来实现设计的功能。利用编程语言,将人类的思想转
面向对象软件工程实践指南 变为能被计算机理解和执行的程序,该阶段的输出为程序代码。 5.测试 在设计或编码的过程中,会出现一些纰漏或者错误。测试的作用是不断验证已有系统 的功能,排除错误,完善系统。该阶段的具体任务包括单元测试、集成测试、验收测试等, 输出为测试报告。 6.维护 在使用中对发现的错误进行修改或者针对变化的需求对软件进行修改。具体包括三种 类型的维护:改正性维护、适应性维护和完善性维护。其中,改正性维护主要对运行中发现 的软件错误进行修正,适应性维护主要为了适应变化了的软件工作环境而进行的适当变更, 完善性维护则主要针对软件需求的变化而做变更。 传统的软件工程学是符合工程学原理的一套体系。传统软件工程学的出现,很大程度 上解决了“软件危机”中的一些问题。其优点主要有两个方面:一是将软件的生命周期划分 为若干个独立的阶段,便于不同人员分工协作:另一方面,在每个阶段结束前都进行严格的 审查,可有效地保证软件的质量。 然而,传统软件工程最主要的问题是缺乏灵活性,它要求必须在项目开始前说明全部 需求,但这恰恰是非常困难的。当软件规模比较大,并且软件的需求是模糊的或者随时间变 化而变化时,传统软件工程就会存在很多问题。同时,传统的软件工程采用了结构化的技术 来完成软件开发的各项任务,比较明显的问题是开发效率比较低下,软件中代码的复用率低, 软件维护比较困难。由于传统软件工程强调更多的是模块化,各个小模块组成了系统的功能。 随着用户的需求的改变和技术的发展,模块经常需要改变。而这是传统软件工程很难处理的 情况,因为局部功能模块的修改甚至可能带来整个系统的改变。低下的开发效率和代码复用 率成为了传统软件工程继续发展的瓶颈。 1.4面向对象方法学 现代软件工程主要指的是面向对象的软件工程。所谓面向对象,就是针对现实中客观 存在的事物进行软件开发。这是类似于人的直观思维方式的。 众所周知,客观世界是由许多不同的具有自己的运动规律和内部状态的对象构成。不 同的对象之间相互作用和交互形成了完整的客观世界。因此,从思维模式的角度,面向对象 与客观世界相对应,对象概念就是现实世界中对象的模型化。从人类的认知过程的角度来看, 面向对象的方法既提供了从一般到特殊的演绎手段(如继承等),又提供了从特殊到一般的 归纳形式(如类等)。面向对象方法学是遵循一般认知方法学的基本概念而建立起来的完整 理论和方法体系。因此,面向对象方法学也是一种认知方法学。 8
面向对象软件工程实践指南 8 变为能被计算机理解和执行的程序,该阶段的输出为程序代码。 5.测试 在设计或编码的过程中,会出现一些纰漏或者错误。测试的作用是不断验证已有系统 的功能,排除错误,完善系统。该阶段的具体任务包括单元测试、集成测试、验收测试等, 输出为测试报告。 6.维护 在使用中对发现的错误进行修改或者针对变化的需求对软件进行修改。具体包括三种 类型的维护:改正性维护、适应性维护和完善性维护。其中,改正性维护主要对运行中发现 的软件错误进行修正,适应性维护主要为了适应变化了的软件工作环境而进行的适当变更, 完善性维护则主要针对软件需求的变化而做变更。 传统的软件工程学是符合工程学原理的一套体系。传统软件工程学的出现,很大程度 上解决了“软件危机”中的一些问题。其优点主要有两个方面:一是将软件的生命周期划分 为若干个独立的阶段,便于不同人员分工协作;另一方面,在每个阶段结束前都进行严格的 审查,可有效地保证软件的质量。 然而,传统软件工程最主要的问题是缺乏灵活性,它要求必须在项目开始前说明全部 需求,但这恰恰是非常困难的。当软件规模比较大,并且软件的需求是模糊的或者随时间变 化而变化时,传统软件工程就会存在很多问题。同时,传统的软件工程采用了结构化的技术 来完成软件开发的各项任务,比较明显的问题是开发效率比较低下,软件中代码的复用率低, 软件维护比较困难。由于传统软件工程强调更多的是模块化,各个小模块组成了系统的功能。 随着用户的需求的改变和技术的发展,模块经常需要改变。而这是传统软件工程很难处理的 情况,因为局部功能模块的修改甚至可能带来整个系统的改变。低下的开发效率和代码复用 率成为了传统软件工程继续发展的瓶颈。 1.4 面向对象方法学 现代软件工程主要指的是面向对象的软件工程。所谓面向对象,就是针对现实中客观 存在的事物进行软件开发。这是类似于人的直观思维方式的。 众所周知,客观世界是由许多不同的具有自己的运动规律和内部状态的对象构成。不 同的对象之间相互作用和交互形成了完整的客观世界。因此,从思维模式的角度,面向对象 与客观世界相对应,对象概念就是现实世界中对象的模型化。从人类的认知过程的角度来看, 面向对象的方法既提供了从一般到特殊的演绎手段(如继承等),又提供了从特殊到一般的 归纳形式(如类等)。面向对象方法学是遵循一般认知方法学的基本概念而建立起来的完整 理论和方法体系。因此,面向对象方法学也是一种认知方法学
面向对象软件工程实践指南 现实问题空间 面向对象解空间 I 物质 对象 意识 类 图1-3从现实问题到对象解空间映射 从软件技术角度来讲,面向对象方法起源于信息隐蔽和抽象数据类型概念,它以对象 作为基本单位,把系统中所有资源,如数据、模块以及系统都看成对象,每个对象把一组数 据和一组过程封装在一起。面向对象方法是面向对象技术在软件工程的全面应用。如图1-3 所示,面向对象方法从现实世界中的问题域直接抽象,确定对象,根据对象的特性抽象,用 类来描述相同属性的对象,而类又分成不同的抽象层次,类成为面向对象设计的最基本模块, 它封装了描述该类的数据和操作,数据描述了对象具体的状态,而操作确定了对象的行为。 1.4.1面向对象方法学的起源 面向对象方法学的发展历史大致可以划分为四个阶段。 (1)萌芽阶段(20世纪50年代) 在20世纪50年代初,面向对象方法中的“对象”,“属性”等概念第一次出现在关于 人工智能的著作中。到50年代后期,随着面向对象的编程语言(Object--Oriented Programming Language,OOPL)的出现,面向对象的思想开始真正的蓬勃发展。为了避免变量名在不同部 分发生冲突,ALGOL语言的设计者在ALGOL60中采用了以"Begin…End"为标识的程序 块,使得块内变量名是局部的,从而避免它们与程序中块外的同名变量相冲突。这是编程语 言中首次提供封装的尝试。此后程序块结构广泛用于高级语言如Pascal、Ada、C之中。 (2)初期阶段(20世纪60年代) 20世纪60年代中期,由挪威计算中心和奥斯陆大学共同研制的Simula语言,在ALGOL 基础上,首次引入了类、继承和对象等概念,成为面向对象方法学在软件工程领域的起源标 志。在Simula67影响下,70年代Xerox PARC研究所发明了以类为核心概念的Smalltalk编 程语言。在Smalltalk中,对象和消息广泛地应用在了基础的运算中,而且相比Simula67, Smalltalk中的对象是动态的,而并非Simula中的静态对象。在Smalltalk之后,在1980年, Xerox研究中心又推出Smalltalk-80系统,强调了对象概念的统一,并引入了方法、实例等 概念和术语,应用了单重继承机制和动态链接。它从界面、环境、工具、语言以及软件可重 用等方面对软件开发工作提供了较为全面的支持,使得面向对象程序设计趋于完善,掀起了 9
面向对象软件工程实践指南 9 图 1-3 从现实问题到对象解空间映射 从软件技术角度来讲,面向对象方法起源于信息隐蔽和抽象数据类型概念,它以对象 作为基本单位,把系统中所有资源,如数据、模块以及系统都看成对象,每个对象把一组数 据和一组过程封装在一起。面向对象方法是面向对象技术在软件工程的全面应用。如图 1-3 所示,面向对象方法从现实世界中的问题域直接抽象,确定对象,根据对象的特性抽象,用 类来描述相同属性的对象,而类又分成不同的抽象层次,类成为面向对象设计的最基本模块, 它封装了描述该类的数据和操作,数据描述了对象具体的状态,而操作确定了对象的行为。 1.4.1 面向对象方法学的起源 面向对象方法学的发展历史大致可以划分为四个阶段。 (1)萌芽阶段(20 世纪 50 年代) 在 20 世纪 50 年代初,面向对象方法中的“对象”,“属性”等概念第一次出现在关于 人工智能的著作中。到 50 年代后期,随着面向对象的编程语言(Object-Oriented Programming Language, OOPL)的出现,面向对象的思想开始真正的蓬勃发展。为了避免变量名在不同部 分发生冲突,ALGOL 语言的设计者在 ALGOL60 中采用了以"Begin……End"为标识的程序 块,使得块内变量名是局部的,从而避免它们与程序中块外的同名变量相冲突。这是编程语 言中首次提供封装的尝试。此后程序块结构广泛用于高级语言如 Pascal 、Ada、C 之中。 (2) 初期阶段(20 世纪 60 年代) 20 世纪 60 年代中期,由挪威计算中心和奥斯陆大学共同研制的 Simula 语言,在 ALGOL 基础上,首次引入了类、继承和对象等概念,成为面向对象方法学在软件工程领域的起源标 志。在 Simula67 影响下,70 年代 Xerox PARC 研究所发明了以类为核心概念的 Smalltalk 编 程语言。在 Smalltalk 中,对象和消息广泛地应用在了基础的运算中,而且相比 Simula67, Smalltalk 中的对象是动态的,而并非 Simula 中的静态对象。在 Smalltalk 之后,在 1980 年, Xerox 研究中心又推出 Smalltalk-80 系统,强调了对象概念的统一,并引入了方法、实例等 概念和术语,应用了单重继承机制和动态链接。它从界面、环境、工具、语言以及软件可重 用等方面对软件开发工作提供了较为全面的支持,使得面向对象程序设计趋于完善,掀起了
面向对象软件工程实践指南 面向对象研究的高潮。 (3)发展阶段(20世纪80年代中期到90年代) 该阶段,受到Smalltalk-80的影响,大批面向对象编程语言相继涌出,如Object--C、Eiffel、 C+、Java、Object-Pascal等。 80年代中期,C语言扩展到面向对象的领域上,于是C+在80年代应运而生。C+保 留了C语言的原有特性,同时增加了面向对象的支持。因此,C++是一种既支持面向过程编 程,又支持面向对象编程的混合式编程语言。 在C+之后,Java和C#是最广泛应用的面向对象编程语言。它们都引入了虚拟机的概 念,且语法上都与C和C+相近。这两种语言是更为纯粹的面向对象语言。近些年来动态 语言如Python,Ruby的流行,又推动了面向对象技术的发展。 1989年,Object Management Group(OMG)公司建立。OMG的使命是建立工业标准, 细化对象管理描述和应用开发的通用框架。统一建模语言(Unified Modeling Language, UML)就是由OMG维护的众所周知的描述之一。UML是为软件系统的制品进行描述、可 视化、构造、文档化的一种语言。它同样适用于商业模块和其他非软件系统。 (4)成熟阶段(20世纪90年代之后) 自l990年,面向对象分析(Object Oriented Analysis,OOA),面向对象设计(Object Oriented Design,OOD)被广泛研究,许多专家都在尝试不同的方法进行面向对象分析和设 计。其中比较著名的方法有Grady Booch方法、Jocobson的OOSE方法、Rumbaugh的OMT 方法等,这些方法各有所长。这段时期,面向对象分析和设计技术逐渐走向实用,最终形成 了从分析、设计、编程、测试到维护的一整套软件开发体系。其中在支持面向对象建模的方 法学的竞技中,统一建模语言UML最终成为建模领域的标准。 1.4.3面向对象方法学的核心概念 面向对象方法学可以用下列公式进行表述: 面向对象方法学=对象+类+继承+基于消息的通信 即面向对象使用了对象,类和继承的机制,同时对象之间只能通过传递消息来实现相 互通信。 1.对象(Object).:一切都是对象 自然界存在的一切事物都可以称作对象。例如学生是对象,老师是对象,教室是对象, 一个学校也是一个对象。对象是其自身所具有的状态特征和作用于这些状态特征的操作集合 一起构成的独立实体。对象包含两个要素:描述对象静态特征的属性和描述对象动态特征的 操作。对象是面向对象方法学的基本单位,是构成和支持整个面向对象方法学的基石。 2.类(Class):物以类聚 10
面向对象软件工程实践指南 10 面向对象研究的高潮。 (3)发展阶段(20 世纪 80 年代中期到 90 年代) 该阶段,受到 Smalltalk-80 的影响,大批面向对象编程语言相继涌出,如 Object-C、Eiffel、 C++、Java、Object-Pascal 等。 80 年代中期,C 语言扩展到面向对象的领域上,于是 C++在 80 年代应运而生。C++保 留了 C 语言的原有特性,同时增加了面向对象的支持。因此,C++是一种既支持面向过程编 程,又支持面向对象编程的混合式编程语言。 在 C++之后,Java 和 C#是最广泛应用的面向对象编程语言。它们都引入了虚拟机的概 念,且语法上都与 C 和 C++相近。这两种语言是更为纯粹的面向对象语言。近些年来动态 语言如 Python,Ruby 的流行,又推动了面向对象技术的发展。 1989 年,Object Management Group (OMG)公司建立。OMG 的使命是建立工业标准, 细化对象管理描述和应用开发的通用框架。统一建模语言 (Unified Modeling Language, UML)就是由 OMG 维护的众所周知的描述之一。UML 是为软件系统的制品进行描述、可 视化、构造、文档化的一种语言。它同样适用于商业模块和其他非软件系统。 (4) 成熟阶段(20 世纪 90 年代之后) 自 1990 年,面向对象分析(Object Oriented Analysis,OOA),面向对象设计(Object Oriented Design,OOD)被广泛研究,许多专家都在尝试不同的方法进行面向对象分析和设 计。其中比较著名的方法有 Grady Booch 方法、Jocobson 的 OOSE 方法、Rumbaugh 的 OMT 方法等,这些方法各有所长。这段时期,面向对象分析和设计技术逐渐走向实用,最终形成 了从分析、设计、编程、测试到维护的一整套软件开发体系。其中在支持面向对象建模的方 法学的竞技中,统一建模语言 UML 最终成为建模领域的标准。 1.4.3 面向对象方法学的核心概念 面向对象方法学可以用下列公式进行表述: 面向对象方法学=对象+类+继承+基于消息的通信 即面向对象使用了对象,类和继承的机制,同时对象之间只能通过传递消息来实现相 互通信。 1. 对象 (Object):一切都是对象 自然界存在的一切事物都可以称作对象。例如学生是对象,老师是对象,教室是对象, 一个学校也是一个对象。对象是其自身所具有的状态特征和作用于这些状态特征的操作集合 一起构成的独立实体。对象包含两个要素:描述对象静态特征的属性和描述对象动态特征的 操作。对象是面向对象方法学的基本单位,是构成和支持整个面向对象方法学的基石。 2. 类 (Class):物以类聚
面向对象软件工程实践指南 类是对具有相同属性、特征和服务的一个或一组对象的抽象定义。类与对象是抽象描 述与具体实例的关系,一个具体的对象被称作类的一个实例(Instance)。例如学生是对所有 种类的学生的抽象,某个学生小张可以看作是学生类型的一个实例。 3.继承(Inheritance):世界的相似性与多样性 世界万物既有相似性,又有多样性。通过继承机制,可以达到相似性与多样性的统一。 一方面子类继承父类定义的属性和操作,另一方面,子类又可以添加自己的属性和操作,或 者通过多态机制使得父类中定义的操作有自己的实现。 4.基于消息的通信(Communication With Message):消息,合作之道 消息(Message)是面向对象软件中对象之间交互的途径,是对象之间建立的一种通信 机制,通常是指向其他对象发出服务请求或者参与处理其他对象发来的请求。一条消息的必 备信息有:消息名、消息请求者、消息响应者、消息所要求的具体服务和参数等。 消息通信(Communication with Messages)也是面向对象方法学中的一条重要原则,它 与对象的封装原则密不可分。封装使对象成为一些各司其职、互不干扰的独立单位:消息通 信则为它们提供了唯一合法的动态联系途径,使它们的行为能够互相配合,构成一个有机的 系统。 1.4.4面向对象的特性 L.抽象(Abstraction) 抽象是指强调实体的本质、内在的属性和行为,而忽略一些无关的属性和行为。抽象 描述了一个对象的内涵,可以将对象与所有其他类型的对象区分开来。对于给定的问题域决 定一组正确的抽象是面向对象设计的核心问题。 2.封装(Encapsulation) 封装是指把对象的属性和操作结合成一个独立的系统单位,并尽可能的隐藏对象的内 部细节。封装是对象和类的一个基本特性,又称信息隐藏。通过对象的封装性,用户只能看 到对象封装界面上的信息,对象内部对用户是透明的,从而有效地实现了模块化功能。封装 可以使对象形成接口和实现两个部分,将功能和实现分离,避免误操作。 3.多态(Polymorphism) 多态指一般类中定义的属性或方法被特殊类继承之后,可以具有不同的数据类型或表 现出不同的行为。使用多态技术时,用户可以发送一个通用的消息,而实现的细节则由接受 对象自行决定,这样,同一消息就可以调用不同的方法。多态性不仅增加了面向对象软件系 统的灵活性,进一步减少了信息冗余,而且显著提高了软件的可重用性和可扩充性。 11
面向对象软件工程实践指南 11 类是对具有相同属性、特征和服务的一个或一组对象的抽象定义。类与对象是抽象描 述与具体实例的关系,一个具体的对象被称作类的一个实例(Instance)。例如学生是对所有 种类的学生的抽象,某个学生小张可以看作是学生类型的一个实例。 3. 继承(Inheritance):世界的相似性与多样性 世界万物既有相似性,又有多样性。通过继承机制,可以达到相似性与多样性的统一。 一方面子类继承父类定义的属性和操作,另一方面,子类又可以添加自己的属性和操作,或 者通过多态机制使得父类中定义的操作有自己的实现。 4. 基于消息的通信 (Communication With Message):消息,合作之道 消息(Message)是面向对象软件中对象之间交互的途径,是对象之间建立的一种通信 机制,通常是指向其他对象发出服务请求或者参与处理其他对象发来的请求。一条消息的必 备信息有:消息名、消息请求者、消息响应者、消息所要求的具体服务和参数等。 消息通信(Communication with Messages)也是面向对象方法学中的一条重要原则,它 与对象的封装原则密不可分。封装使对象成为一些各司其职、互不干扰的独立单位;消息通 信则为它们提供了唯一合法的动态联系途径,使它们的行为能够互相配合,构成一个有机的 系统。 1.4.4 面向对象的特性 1. 抽象(Abstraction) 抽象是指强调实体的本质、内在的属性和行为,而忽略一些无关的属性和行为。抽象 描述了一个对象的内涵,可以将对象与所有其他类型的对象区分开来。对于给定的问题域决 定一组正确的抽象是面向对象设计的核心问题。 2. 封装(Encapsulation) 封装是指把对象的属性和操作结合成一个独立的系统单位,并尽可能的隐藏对象的内 部细节。封装是对象和类的一个基本特性,又称信息隐藏。通过对象的封装性,用户只能看 到对象封装界面上的信息,对象内部对用户是透明的,从而有效地实现了模块化功能。封装 可以使对象形成接口和实现两个部分,将功能和实现分离,避免误操作。 3. 多态 (Polymorphism) 多态指一般类中定义的属性或方法被特殊类继承之后,可以具有不同的数据类型或表 现出不同的行为。使用多态技术时,用户可以发送一个通用的消息,而实现的细节则由接受 对象自行决定,这样,同一消息就可以调用不同的方法。多态性不仅增加了面向对象软件系 统的灵活性,进一步减少了信息冗余,而且显著提高了软件的可重用性和可扩充性