OOP技术理解面向对象_第1页
OOP技术理解面向对象_第2页
OOP技术理解面向对象_第3页
OOP技术理解面向对象_第4页
OOP技术理解面向对象_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、OOP技术: 理解面向对象在本章中,你将学习如下内容:l如何理解面向对象思维方式。l 对象如何通信。l对象如何与其他对象关联。l对象如何组合。面向对象技术已经席卷了整个软件界,事实也确实如此。作为一种程序设计方法,它具有很多优点。基于构件的软件开发方法就是面向对象技术孕育出来的。采用这种方法建立一个系统时,首先建立一组类,然后通过增加已有构件的功能或者添加新的构件来逐步扩充系统,最后在建立一个新系统时,你还可以重用已经创建好的类。这样做可以大大削减系统开发时间。使用UML可以建立起易于使用和易于理解的对象模型。程序员能够创建出这些模型所对应的软件。因此,UML对基于类开发的全过程都有益处。面向

2、对象是一种思维方法它是依赖于几个基本原则的思维方法。在这一章中,你将学习到这些基本原则。你将搞清楚对象是什么,在分析和设计中如何利用对象。从下一章开始介绍如何根据这些基本原则运用UML。2.1 无处不在的对象对象,不论是具体的还是抽象的,遍布于我们的周围。它们组成了整个世界。正如前一章所指出的,典型的现代软件都要模拟现实世界(至少是模拟现实世界的一个片段),因此程序通常也要模拟现实世界中的对象。如果体会了对象的实质,那么你就能够理解如何用软件来表达对象,以及软件是否是面向对象的。传统的程序员能够从面向对象概念中受益,因为面向对象概念提供了他们所工作的领域的建模。首先也是最重要的,对象是一个类(

3、种类)的实例。例如,你和我都是Person这个类的实例。对象具有自身的结构(structure)。也就是说,它具有属性(特性)和行为。对象的行为包括它所能执行的操作。属性和操作合起来被称为特征(feature)。符号约定为了帮助你习惯UML符号,我将使用我在第1章中提到的一些面向对象的约定,包括:类名以大写字母开头。包含多个单词的类名,所有的单词都连接在一起,并且每个单词的第一个字母都大写。特征(属性和操作)的名字以小写字母开始。多个单词组成的特征名,所有的单词连接在一起,除了第一个字母小写,其他每个单词的第一个字母都大写。操作名的后面跟上一对括号。你和我作为Person这个类的对象,都具有一

4、些共同的属性:身高、体重和年龄等(不难想象,还有许多其他的属性)。我们每个人之所以独一无二,是因为我们每个人的这些属性都有一个特定的值。我们都能执行一些共同的操作:吃饭、睡觉、读书、写字、说话、工作等(或者用对象语言来描述,就是eat()、sleep()、read()、write()、talk()和goToWork()。如果要创建一个处理人事信息的系统(例如工资发放系统或者人力资源部门的信息管理系统),那么在软件中很可能要包括上面提到的一些属性和操作。在面向对象世界里,类除了起到分类的作用外,还有其他用途。类是用来创建对象的模板。可以把类看成是加工小甜饼的模子,你可以用来压出新的小甜饼对象(有

5、些人可能认为这个模子起的作用仍然是分类,此处不做评论)。让我们再回到洗衣机的例子。如果指定洗衣机类具有brandName、modelName、serialNumber和capacity等属性,还有acceptClothes()、acceptDetergent()、turnOn()和turnOff()等操作的话,你就有了制造WashingMachina类新实例的机制。也就是说,可以基于洗衣机这个类创建新的对象(参见图2.1)。这在面向对象的软件开发中尤其重要。尽管本书的重点不是讨论程序设计,但是如果你了解面向对象程序设计语言中的类可以创建新实例的话,会有助于你理解面向对象的基本概念。图2.1 W

6、ashingMachine类是创建新的洗衣机实例的模板还有其他一些要了解的内容。记住,面向对象的目标是开发出能够反映现实世界某个特定片段的软件(或者说是“建模”)。你考虑到的属性和行为越多,你所建立的模型就越符合实际。在洗衣机的例子中,如果你在洗衣机类中包括drumVolume(洗涤缸容量)、trap(水阀)、motor(马达)和motorSpeed(马达转速)等属性的话,洗衣机模型就更精确。同样,如果洗衣机类中增加了acceptBleach()和controlWaterLevel()等操作的话,也会增加模型的精确性(参见图2.2)。图2.2 模型中的属性和操作越多,模型就越接近实际2.2 一

7、些面向对象的概念面向对象并不只局限于对象的属性和行为建模,它还包含对象的其他方面。这些方面包括抽象(abstraction)、继承(inheritance)、多态(polymorphism)和封装(encapsulation)。其他3种重要的面向对象概念是消息传递(message sending)、关联(association)和聚集(aggregation)。下面让我们逐个学习这些概念。 抽象简单地讲,抽象(abstraction)的意思就是过滤掉对象的一部分特性和操作直到只剩下你所需要的属性和操作。那么“只剩下你所需要的”是什么含义呢?不同类型的问题需要不同数量的信息,即使这些问题都属于同

8、一个领域也是如此。与第一次所设计出的洗衣机类相比,第二次所设计的洗衣机类中出现了更多的属性和操作。增加的属性和操作物有所值吗?如果你是一个开发小组的成员,你所在的开发小组的最终目标是要开发出能够模拟洗衣机如何工作的计算机程序,那么第二次增加的属性和操作绝对有必要。像这样的计算机程序(这样的程序对真正制造洗衣机的工程师很可能也会大有益处)必须有足够多的信息来准确的预测当洗衣机刚出厂时、发挥全部功能时和洗衣服时将会发生什么。对这个程序来说,你可以过滤掉serialNumber这个属性,因为它很可能没有什么用处。另一方面,如果你准备编制软件来跟踪一个拥有许多洗衣机的洗衣店的业务时,那么第二次增加的属

9、性可能就不太值得了。在这个程序中你可能不需要在前一节中所提到的操作和属性等细节。但是你却需要serialNumber这个属性用来标识每个洗衣机对象。你的洗衣机要包括什么,不包括什么,在做出这样的决策后所保留的部分就是对洗衣机的抽象。关键技术一些权威认为抽象对于建模者来说是最重要的技术,也就是说要搞清楚什么应该纳入模型中,什么应该舍去。 继承洗衣机、电冰箱、微波炉、烤箱、洗碗机、收音机、饼干机、搅拌机和电熨斗可看成类,它们都是另一个更一般的类家用电器(appliance)类的成员。在面向对象的世界中,我们可以说上述的每一种都是Appliance类的子类(subclass)。也可以这么说,Appl

10、iance类是这些类的超类(superclass)。Appliance类具有的属性是onOffSwitch和electricWire,具有turnOn()和turnOff()操作。因此,如果你知道某物是家用电器的话,那么你就立即知道它具有Appliance类的属性和操作。面向对象概念中,这种关系叫做继承。每个Appliance的子类(WashingMachine、Refrigerator、Blender等等)都继承了Appliance的特征。同时,要重点注意一下,每个子类都增加了自己的属性和操作。图2.3示意了这种超类子类关系。图2.3 各种家用电器继承了Appliance类的属性和操作。每种

11、家用电器都是Appliance类的子类。Appliance类是各个子类的超类继承到这里还没完。例如,Appliance还可以是Household Item(家用商品)类的子类。Furniture(家具)是Household Item的另一个子类,如图2.4所示。当然Furniture还有它的子类。图2.4 超类也可以继承其他超类,从而成为其他超类的子类 多态性有时不同的类具有相同名称的操作。例如,你可以打开一扇门、打开一扇窗、打开一张报纸、打开一件礼物、打开银行账号、甚至打开一段对话。每种情形都是执行一个不同的操作。在面向对象中,每个类都能够自己“知道”如何执行自己的打开操作。这就叫做多态性(

12、polymorphism)(参见图2.5)。图2.5 在多态的情况下,不同的类中可以有同名的操作,每个类中发生的操作各不相同乍一看,这个概念看上去对软件开发者来说比对建模者更重要。毕竟,是软件开发者编制实现这些方法的计算机程序软件,因此他们必须清楚这些同名的操作之间的重要区别。并且,他们所构造出的软件类要能够“知道”自己应该怎么做。然而,多态性对建模者也很重要。它可以让建模者用客户的语言和术语与客户交流(而要被建模的对象只有客户才熟悉)。有时术语会自然导致操作词有多种不同的含义(像“打开”)。理解多态性的概念就可以让建模者省去发明新术语以及维护术语一致性的麻烦,而仍然维持客户所采用的术语。 封

13、装在几年前流行有线电视的时候,两个人在一起谈论,如果在拨打长途电话号码之前先拨一个特殊的7位号码,那么他们将会省钱。其中的一个人怀疑地问:“这是什么原理?”另一个回答说:“爆米花是怎么炸出来的?,关心这个干嘛?”。这就是封装(encapsulation)的实质:当一个对象执行自己的操作时,它对外界隐藏了操作的细节(参见图2.6)。当一些人看电视时,通常大部分人都不关心电视机后面罩子里隐藏的复杂电子元器件,也不关心这些电子元器件如何操作来产生电视画面。电视机做了自己要做的事并且对我们隐藏了它的工作过程。大部分其他家用电器也都是以这种方式工作的。封装有什么作用呢?在软件世界中,封装有助于减少某些不

14、利因素的影响。在一个包含对象的系统中,对象之间以各种方式相互依赖。如果其中一个对象出现故障,软件工程师不得不修改它的时候,对其他对象隐藏这个对象的操作意味着只需修改这个对象而不需要改变其他对象。图2.6 对象封装了它们要做什么。也就是说对外界和其他对象来说,它隐藏了操作的细节再从软件世界转到现实世界,封装对于对象也同样重要。计算机的显示器对计算机中央处理器隐藏了自己的操作。当显示器发生故障的时候,只需修理它或者把它替换掉。不大可能因为显示器的故障而修理换掉中央处理器。在讨论封装这个主题的时候,还有另一个相关概念。封装(encapsulation)意味着对象对其他对象和外部世界隐藏了自己要做什么

15、,因此它也被称为信息隐藏(information hiding)。但是对象总要给外部世界提供一个“接口”,用来初始化这些操作。例如,电视机上一般都设有一组按钮或者提供带有按钮的遥控器。洗衣机也提供了一组按键,让你能够设置它的温度和水位。电视机的按钮和洗衣机的按键都称为接口(interface)。 消息传递前面曾经提过,在系统中对象是要相互协作的。对象之间的协作是通过相互发送消息。一个对象发送一个操作消息(或请求)给另一个对象,接收消息的对象就执行这个操作。电视机和遥控器就是我们身边一个直观的例子。当你想看电视的时候,就得到处找遥控器,坐在你最喜欢的坐椅上,按下遥控器的“开机”按钮。然后发生了什

16、么呢?遥控器对象向电视机对象发送了一个开机消息(实实在在的消息),电视机对象接收这个消息知道怎样去执行开机操作,并打开自己。当你想换个电视频道的时候,只需按下遥控器上有关的调台按钮,遥控器对象就向电视机对象发送另外一种消息“改变频道”。遥控器还可以通过调音量消息、降低音量消息等其他消息与电视机对象通信。再回过头来讨论接口。从椅子上起来,走到电视机前按下电视机上的按钮也可以做遥控器所能做到的大部分事情。电视机提供给你的接口(一组按钮)显然与它提供给遥控器的接口(红外线接收器)不同。图2.7示意了这个过程。图2.7 对象之间消息传递的一个例子。遥控器对象向电视机对象发送消息,通知电视机开机。电视机

17、对象通过一个红外线接收器为接口,接收遥控器发来的消息回顾第1章实际上你已经见到过消息传递的情况。在第1章的顺序图中(图1.5),箭头代表从一个对象到另外一个对象的消息。 关联另一个常见情况是对象之间通常以某种方式发生联系。例如,当你打开电视机的时候,用面向对象的术语来讲,就是你和电视机发生了关联(association)。“开机(turn-on)”是一个单向关联(单方向发生关系),如图2.8所示。也就是说,只能是你打开电视机。其他的关联,例如“结婚(is married to)”,是双向关联。图2.8 对象之间通常以某种方式发生关联。当你打开电视机时,你和电视机之间就发生单向关联有时一个对象可

18、能和另一个对象之间以多种方式发生关联。例如,你和你的工友同时又是朋友。这时你和他之间既形成了“是朋友(is the friend of)”关联,又形成了“是工友(is the coworker of)”关联,如图2.9所示。图2.9 对象之间有时能以多种方式发生关联一个类可以和多个其他的类关联。一个人可以驾驶(ride in)一辆轿车,也可以驾驶一辆公共汽车(参见图2.10)。多重性(multiplicity)是对象之间关联的一个重要方面。它说明了在关联中一个类的对象可以对应另一个类的多少个对象。例如,以典型的大学课程为例,一门课程由一名教师来讲授。课程和教师之间就是一个一对一(one-to-

19、one)的关联。然而,对于一个研讨教学课程来说,在一个学期中可以由好几名教师来讲授这门课程。在这种情况下,课程和教师之间是一个一对多(one-to-many)的关联。如果你自己观察的话就可以发现各种各样的多重性。一个自行车有两个轮胎(一对二多重性);一个三轮车有3个轮胎;一个18轮车有18个轮胎,等等。图2.10 一个类可以和多个类关联 聚集想一想你的计算机系统。它包括主机箱、键盘、鼠标、显示器、CD-ROM驱动器、一个或者多个硬盘驱动器、调制解调器、软盘驱动器、打印机,可能还有音箱。主机箱中除了带有前面提到的驱动器外,还有CPU、显示卡、声卡和其他一些你觉得不能缺少的组件。你的计算机是一个聚

20、集(aggregation)体,聚集是对象之间的另一种关联。像其他许多有用的东西一样,计算机是由许多不同类型的构件组成的(参见图2.11)。你可能还能举出许多聚集的例子出来。图2.11 一个典型的计算机系统就是聚集的一个例 子它由许多不同类型的对象组合而成聚集的一种形式是聚集对象和它的组成对象之间具有强关联。这种聚集被称为组成(composition)。组成关键特征是部分对象只能存在于组成对象之中。例如,衬衫是衬衫主体、衣领、衣袖、纽扣、纽扣缝和袖口的组成体。如果衬衫变得无价值了,那么领子也就不存在了。有时,部分体的寿命比组成体短。树叶可能先于树而消亡。如果你毁掉这颗树,树叶也随之不复存在(如

21、图2.12所示)。图2.12 在组成体中,部分体有时可能会先于组成体消亡。如果组成体被销毁,则部分体随组成体一同被销毁因为聚集和组成反映了极其普遍现象,因而是很重要的。它们能够帮助你建立更接近现实的模型。如果你对这类内容感兴趣面向对象思想的吸引力之一在于它和人类思想并驾齐驱,常常不谋而合。我们之所以把周围的事物分门别类,也许是因为对我们的大脑来说,区分几个类别远远比区分众多实例来的容易。近期对大脑区域的研究点包括对物体的分类。心理学家Isabel Gauthier和Michael Tarr使用了专门为此项研究设计的新奇物体,并配合使用了展现大脑即时状态的图像技术。他们发现,当人们学习(按照实验

22、者定义的规则)对这些物体分类的时候,大脑皮层的一个特定区域逐渐变得活跃起来(这个区域就是梭状回,fusiform gyrus)。2.3 意 义对象和对象之间的关联构成了系统功能的骨架。为了对系统按规定建模,必须理解这些关联是什么。如果对关联类型很明确,那么当你和客户交谈、收集他们的需求,并帮助他们建立满足业务要求的系统模型时,你的脑海里就会充满有用的点子。运用面向对象的概念来帮助你理解客户的领域知识,或者叫做客户的领域(domain),并且用客户能够理解的术语来说明你对问题的理解,这点是最重要的。这一点也是UML流行的原因。在后面3章中,我们将学习如何使用UML来可视化表达你在本章所学到的概念。2.4 小 结面向对象是一个依赖于几个基本原则的思维方法。对象是类的实例。类是具有相同属性和操作的一类对象集。当你创建了一个对象后,对象的属性和操作数目由你所处理的问题域确定。继承是面向对象中的一个重要方面。对象继承了所属类的属性和操作。类同样也可以继承其他类的属性和操作。多态性是另一个重要的方面它是指不同的类中可以有相同名字的操作,并且这个操作在每个类中都能以各自不同的方式执行。对象对其他对象和外部世界隐藏了其操作的执行过程。每个对象都要提供一个让其他对象(和人)用来执行该对象中操作的接口。对象

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论