当前位置:文档之家› 第2章 理解面向对象概念

第2章 理解面向对象概念

第一部分 基础知识
第 2 章 理解面向对象概念
第 2 章 理解面向对象概念
在本章中,你将学习面向对象技术中的基本概念,这些概念是系统建模的基础。你将具 体学习到下列面向对象技术中的概念: 抽象 继承 多态 封装 消息传递 关联 聚集
面向对象技术已经席卷了整个软件界,事实也确实如此。做为一种程序设计方法,面向 对象技术具有很多优点。基于构件的软件开发方法就是面向对象技术孕育出的产物。采用这 种方法建立一个系统时,首先构造一组类(构件),然后通过增加已有构件的功能或者添加 新的构件来逐步扩充系统,最后在建立其它新系统时,你还可以重用先前已经构造好的构件。 这样做可以大大削减系统开发时间。
使用 UML 可以建立起易于使用和易于理解的面向对象模型,以使程序员能够构造出这 些模型所对应的软件制品。因此,UML 对基于构件开发的全过程都有益处。
面向对象是一个思想库——它是依赖于几个核心基本原则的思想库。在这一章中,你将 学习到这些基本原则。你将搞清楚对象是什么,在分析和设计中如何利用对象。从下一章开 始介绍如何根据这些基本原则运用 UML。
式。
图 2.1 洗衣机类(最初的洗衣机模型)是创建洗衣机实例的模板。
还有其它一些要了解的内容。记住,面向对象技术的目标是开发出能够反映现实世界某 个特定片段的软件(或者说这样的软件是对现实世界“建模”)。你考虑到的属性和行为越多, 你所建立的模型就越符合实际。在洗衣机的例子中,如果你在洗衣机类中包括洗涤缸容量 (drum volume)、内部计时器(internal timer)、水阀 (trap)、马达(motor)和马 达转速(motor speed)等属性的话,洗衣机模型就更精确。同样,如果洗衣机类中多了加漂白剂(add bleach)、 设定浸泡时间(time the soak)、设定洗涤时间(time the wash)、设定淋洗时间(time the rinse) 和设定脱水时间(time the spin)等操作的话,也会增加洗衣机模型的的精确性(参见图 2.2)。
对看电视的人来说电 视机隐藏了它的内部 操作。
2.2.5 消息传递
图 2.6 对象封装了其内部信息。也就是说对外界 和其它对象来说,它隐藏了操作的细节。
前面曾经提过,在系统中对象是要相互协作的。对象之间的协作是通过相互发送消息。 一个对象发送一个操作消息给另一个对象,接收消息的对象就执行这个操作。
电视机和遥控器就是我们身边一个直观的例子。当你想看电视的时候,就得到处找电视 机的遥控器,坐在你最喜欢的坐椅上,按下遥控器的“开机”按钮。然后发生了什么呢?遥 控器对象向电视机对象发送了一个开机消息(实实在在的消息),通知电视机打开自己。当
“开机”消息
2.2.6
图 2.7 对象之间消息传递的一个例子。遥控器对象向电视机对象发送消息,通知
2.2.4 封装
在几年前流行有线电视的时候,两个人在一起谈论如何打电话省钱,如果在拨长途电话 号码之前先拨一个特殊的 7 位号码,那么收费就比正常的长途电话费用低。
其中的一个人怀疑地问:“这是什么原理?” 另一个回答说:“爆米花是怎么炸出来的?,关心这个干嘛?”。
第一部分 基础知识
第 2 章 理解面向对象概念
继承到这里还没完。例如家用电器类还可以是家用商品(household item)类的子类。 家具(furniture)类是家用商品类的另一个子类,如图 2.4 所示。当然家具类还有它的子类。
第一部分 基础知识
第 2 章 理解面向对象概念
2.2.3 多态
图 2.4 超类也可以继承其它超类,从而成为其它超类的子类。
2.2.1 抽象
简单地讲,抽象(abstraction)的意思就是过滤掉对象的一部分特性和操作直 到只剩下你所需要的属性和操作。那么“只剩下你所需要的”是什么含义呢?
不同类型的问题需要不同数量的信息,即使这些问题都同属于一个领域也是如此。和第 一次所设计出的洗衣机类相比,第二次所设计的洗衣机类中出现了更多的属性和操作。增加 的属性和操作物有所值吗?
在讨论封装这个主题的时候,还有另一个相关概念。对象对其它对象和外部世 界隐藏了自己的内部信息,因为这个原因封装也被称为信息隐藏(information hiding)。但是对象总要给外部世界提供一个“接口”,用来初始化对象的这些操作。例如, 电视机上一般都有一组按钮或者提供带有按钮的遥控器。洗衣机也提供了一组按键,让你能 够设置洗衣机的温度和水位。电视机的按钮和洗衣机的按键就是一种接口(interface)。
第一部分 基础知识
第 2 章 理解面向对象概念
你想换个电视频道的时候,只需按下遥控器上有关的调台按钮,遥控器对象就向电视机对象 发送不同的调台消息。遥控器还可以通过调音量消息、调音质消息等其它消息与电视机对象 通信。
再回过头来讨论接口。从椅子上起来,走到电视机前直接操纵电视机上自带的按钮也可 以做遥控器所能做到的大部分事情(有空的话你可以自己试试)。电视机提供给你的接口(一 组按钮)显然与提供给遥控器的接口(红外线接收仪)不同。图 2.7 示意了这个过程。
2.1 无处不在的对象
对象,不论是具体的还是抽象的,遍布于我们的周围。它们组成了整个世界。正如前一 章所指出的,典型的现代软件都要模拟现实世界(至少是模拟现实世界的一个片段),因此 程序也通常要模拟现实世界中的对象。如果体会了对象的实质,那么你就能够理解如何用软 件来表达对象。
首先的和最重要的,对象是一个类(种类)的实例。例如,你和我都是人这个 类的实例。对象具有自身的结构(structure)。也就是说,它具有属性(特性) 和行为。对象的行为包括它所能执行的操作。属性和操作合起来被称为特征(feature)。 你和我做为人这个类的对象,都具有一些共同的属性:身高、体重和年龄等(不难想象, 还有许多其它的属性)。我们都能执行一些共同的操作:吃饭、睡觉、读书、写字、说话、 工作等。如果要开发一个处理人事信息的系统(例如工资发放系统或者人力资源部门的信息 管理系统),那么在软件中很可能要包括上面提到的一些属性和操作。 在面向对象世界里,类除了起到分类的作用外,还有其它用途。类是用来创建对象的模 板。可以把类看成是加工小甜饼的机器,这个机器可以制造出新的小甜饼对象(有些人可能 认为这个机器起的作用仍然是分类,此处不做评论)。
在第 3 章“运用面向对象思想”中,你会看到诸如 washing machine 这样的
类 名 被 合 写 成 WashingMachine , 特 征 名 serial number 被 记 为 serialNumber。到本章为止,我们只是用一般语言(汉语、英语)来讨 论面向对象中的基本概念,所以在这里仍然坚持采用一般语言的表达方
如果你是一个开发小组的成员,你所在的开发小组的最终目标是要开发出能够模拟洗衣 机如何工作的计算机程序,那么第二次增加的属性和操作绝对有必要。像这样的计算机程序 (这样的程序对真正制造洗衣机的工程师很可能也会大有益处)必须容纳足够多的信息来准 确的预测当洗衣机刚出厂时、发挥全部功能时和洗衣服时将会发生什么。对这个计算机程序 来说,你可以过滤掉序列号这个属性,因为这个属性很可能没有什么用处。
有时不同的类具有相同名称的操作。例如,你可以打开一扇门、打开一扇窗、 打开一张报纸、打开一件礼物、甚至打开一段对话。每种情形中的“打开 (open)”都是一个不同的操作。用面向对象的术语来讲,每个类都能够自己“知道”如何 执行自己的打开操作。这就叫做多态(polymorphism)(参见图 2.5)。
另一方面,如果你准备编制软件来跟踪记录一个拥有许多洗衣机的洗衣店的交易业务, 那么第二次增加的属性可能就不太值得了。在这个程序中你可能不需要在前一节中所提到的 洗衣机类的许多操作和属性。但是你却需要序列号这个属性用来标识每个洗衣机对象。
你的洗衣机要包括什么,不包括什么,在作出这样的决策后所保留的部分就是对洗衣机 的抽象。
这就是封装(encapsulation)的实质:当一个对象执行自己的操作时,它对外 界隐藏了操作的细节(参见图 2.6)。当我们看电视时,通常大部分人都不关心 视机后面罩子里隐藏的复杂电子元器件,也不关心这些电子器件如何操作来产生电视画 面。电视机做了自己要做的事并且对我们隐藏了它的工作过程。大部分其它家用电器也都是 以这种方式工作的。 封装有什么作用呢?在软件世界中,封装有助于减少某些不利因素的影响。在一个由许 多对象所组成的系统中,对象之间以各种方式相互依赖。如果其中一个对象出现故障,软件 工程师不得不修改它的时候,对其它对象隐藏这个对象的操作意味着只需修改这个对象而不 需要改变其它对象。 再从软件世界转到现实世界,封装对于对象也同样重要。计算机的显示器对中央处理器 隐藏了自己的操作。当显示器发生故障的时候,只需修理它或者把它替换掉。不大可能因为 显示器的故障而修理中央处理器。
另一种可选的陈述是洗衣机、电冰箱、微波炉这些类都是家用电器类的子类 (subclass)。反过来,家用电器是这些类的超类(superclass)。图 2.3 示意了 这种超类-子类关系。
图 2.3 各种家用电器继承了家用电器类的属性和操作。每个具体的家用电器 类都是家用电器类的子类。家用电器类是各个具体家用电器类的超类。
第一部分 基础知识
第 2 章 理解面向对象概念
图 2.2 模型中的属性和操作越多,模型就越接近实际。
2.2 一些概念
面向对象概念并不只局限于对象的属性和行为建模,它还包含对象其它方面的概念。这 些 概 念 包 括 抽 象 ( abstraction )、 继 承 ( inheritance )、 多 态 ( polymorphism) 和 封 装 (encapsulation)。其它三种重要的面向对象概念是消息传递(message sending)、关联 (association)和聚集(aggregation)。下面让我们逐个学习这些概念。
2.2.2 继承
第一部分 基础知识
第 2 章 理解面向对象概念
相关主题