例如有一个人名叫王东,性别男,身高180m、体重68kg,可以修电器,可以教计算机 课,下面我们来描述这个对象。 对象名:王东 对象的状态: 性别:男 身高:1.80m 体重:68kg 对象的功能(可做的操仵) 回答身高 回答体重均属于自身所承受的操作 回答性别 修理电器 属于施加于其它对象的操作 教计算机课 在计算机世界中我们可以把对象看成是存储器中一个可标识的区域,它能保存固定或 可变数目的数值(或数值的集合)。 2.12对象的划分 我们在解决实际问题时,首先要对这个问题进行分析,分析一下要解决的这个问题包含 什么成分,即包含哪几个对象,每一个对象有什么作用,对象之间又有什么关系 要设计一个面向对象的程序,对象的确定和划分是非常重要的,对象的确定与划分得是 否适宜直接影响到所编制的程序的质量。如何才能使对象确定与划分得合理,这就需要对问 题进行全面、细致的分析值得注意的是,对象的确定与划分并没有唯一的标准,它还依赖于 设置对象的目的和所需进行的操作。例如我们要模拟一个学校系统,模拟的目的不同,所选 择的对象就不同 若模拟的目的是为了收集学生的学习情况,那么我们可以设置对象来分别表示学生、教 师、教材、课程、教室、图书馆的图书等 若模拟的目的是为了收集学生在学校的所有学习和生活情况,那么我们在原有的基础 上还需增加学生宿舍、学生食堂以及医院、文体设施、课外活动等作为要考察的对象 在面向对象程序设计中,对象的选择是绝对关键的一步。若对象选择的适宜,既可以便 于程序进行扩充,又可以为以后的其他应用提供基础。如何进行对象的选择,并没有固定的 方法,它衣赖于设计人员的经验和技巧,但对现实世界事物的把握有一个最基本的原则,就 是寻求一个大系统中事物的共性,将所有具有共性的系统成分确定为一种对象 2.1.3对象的状态 个对象之所以能在现实世界中独立存在,是因为它具有自身的状态—即自身所具 有的那些特征。由于这些状态的存在使其能对自身及对外界对象施加操作。当然一个对象 的这些状态并不是完全用来直接为外界服务的,但它们本身是能够为外界服务的基础。 例如一个人的五班六腑是他的内部状态,作为人这个对象还具有一些诸如身高体重等 外部状态。所有这些状态中有一些并不是用来直接向外界提供服务的,如那些内部状态,但
它们体现了人的身体状况,若没有好的身体,人是不能很好地为外界服务的,因此这些内部 状态是基础。 在面向对象系统中,一个对象的状态是通过“域”来描述的,也称为私有存储单元,这些 私有存储单元只能由它自己的操作来进行处理。在C++中我们用成员变量来存放一个对 象的状态。 2.14对象的特性 对象从形式上看是系统程序员,应用程序员或用户所定义的抽象数据米型的变量,当用 户定义了一个对象就创造出了具有丰富内涵的新的抽象数据类型。它是构成和支撑整个面 向对象程序设计OOP)最重要的细胞与基石。它具有下述三个特性 1.模块独立性 从逻辑上看,一个对象是独立存在的模块从外部看这模块,只需了解它具有哪些功能, 至于它如何实现这些功能和使用哪些局部数据来完成它们,则都“隐蔽”在模块内部这意味 着模块内部状态不因外界的干扰而改变,也不会波及到其它模块;模块间的依赖性极小或几 乎没有;各模块可独立为系统所组合选用,也可被程序员重用,而不必担心波及或破坏其它 模块。 2动态连接性 吝观世界中各式各样的对象,井不是孤立存在的,它们之间是有联系的,是它们之间 的相互作用、联系和连接,才构成了世间各种不同的系统。同时,在面向对象程序设计中,通 过消息激活机制把对象之间动态联系连接在一起,使整个机体运转起来,便称为对象的连 接性。 易维护性 由于对象的功能被“隐蔽”,好像被一层封装壳保护在对象内部所以修改完善功能及 其实现的细节都被局限于该对象的内部,不会波及到外部这就使得对象和整个系统变得非 常容易维护。 22消息 如前“劲态连接”所说对象与对象之间并不是彼此孤立的,它们之间存在着联系,在面 向对象系统中,对象之间的联系是通过消息来传递的。 22.1什么是消息 什么是消息,我们通过一个具体的例子来叙述,例如我们在211中举的例子,一个对 象为人,名字叫王东,他是一个电器工程师他可以修理电器,也可以讲计算机课。除去这些 向他人提供的服务外他也要接收其它对象的服务,如吃饭穿衣娱乐等。他要吃饭但不可 能自己去种地,他要穿衣但不可能自已去织布,他就要请求他人来帮助解决这些问题.这里
的“请求”便是一个人与其他人进行交互的手段。同样,他什么时候修电器,什么时候讲课,需 要在得到其他对象的请求后才进行。因此,在面向对象技术中这个“请求”本身就是发送的 “消息”。在日常生活中除去“请求”以外,还有“命令”,如上级对下级的命令等,这些“命令”也 是一种“消息 因此消息是对象之间相互请求或相互协作的途径,是要求某个对象执行其中某个功能 操作的规格的说明 通常我们把发送消息的对象称为发送者,接收消息的对象称为接收者对象间的联系, 只能通过传送消息来进行对象也只有在收到消息时,才被激活,被激活后的对象代码将“知 道”如何去操作它的私有数据,去完成所发送的消息要求的功能。 消息具有三个性质: 同一对象可接收不同形式的多个消息,产生不同的响应; 相同形式的消息可以送给不同对象,所做出的响应可以是截然不同的; 消息的发送可以不考虑具体的接收者,对象可以响应消息,也可以对消息不予理会, 对消息的响应并不是必须的。 222公有消息和私有消息 在面向对象系统中,消息分为两类:即公有消息和私有消息。 到底哪些消息是公有消息,哪些消息是私有消息需要有一个明确的规定。 若有一批消息同属于一个对象,其中有一部分是由外界对象直接向它发送的称之为公 有消息;还有一部分则是它自已向本身发送的这些消息是不对外开放的,外界不必了解它 称之为私有消息。 外界对象向此对象发送消息时只能发送公有消息而不能发送私有消息,私有消息是由 其自身发送的。 例如在C++中有一个对象类的定义如下 char sex[10] void print Name(){…} printadd(){…} id print()i print Name() printadd() 这里表示的是一个人员对象类,它所具有的状态是人的姓名年龄、住址和性别在这里
共有五个消息,消息 print()为公有消息,而 printName()、 mintage()、 printadd()和 print sex()为私有消息。 外界对象只能向 person对象发送 print()消息,而其它的四个私有消息只能由 person 对象自身来发送,例如可由自身的 print()功能来发送这四个私有消息 223特定于对象的消息 所谓特定于对象的消息是指将所有能支持此对象可接受消息的函数集中在一起,形成 个大消息称为特定于对象的消息这些消息让对象执行这个函数而不管它可能做什么及 怎么做。 消息可分为三种类型: 可以返回对象的内部状态的消息; 可以改变对象的内部状态的消息 可以做一些特定的操作,改变系统状态的消息。 22.4消息序列 在日常生活中,人与人之间的交流,并不是只向个人请求帮助或发号施令;也不是只 向别人发出一次请求或命令。 例如,有一个经理,他一上班就给他的下属们分配了如下任务: 老王,今天去银行跑贷款; 老张,中午去找X×容户签合同 小王,上午去参加产品展示会; 小刘,把这份文件送到主管部门; 林秘书,今天将年度总结写出来; 这就是一个非常自然的消息序列。在这个序列中的各个消息如何实施,即如何签合同、 如何送文件如何写总结等,都不是经理的事情,而是具体执行这些指令的人的事情。 在面向对象系统中就是用消息序列来表述要解决的一系列问题的。 下面的一个小例子说明∫在C++语言中的消息序列: char Name [ 20] Int char Goodat[20]; public void print( )scout<<Name<<Age<<Major<<Goodat:) void printName( )(cout<< Name: void printAge( )(cout<<Age: l void print Major( )icout<<<Major oid print Goodat( )(cout<<Goodat lass course char cname [20; 16·
Int roomno t void print()scout<<cname<<roomno<<ctime; void fI(person P) t P P print Major( P. PrintGoodat(); oid f2(person P, course c) t P print (I 在上例中定义了两个对象类 person和 course,函数f1向 person类对象P发送了四个打印 消息,这四个打印消息形成了向同个对象发送的消息序列。至干这四个打印操作如何实施 是对象P的事情,而f1不需要过河。函数2向 person类对象P和 course类对象C各发送 了一个打印消息这两个消息形成了向不同对象发送的消息序列。 2.3类 类是面向对象系统中最重要的概念,面向对象程序设计中的所有的操作都归结为对类 的操作在面向对象程序设计中正因为引入了类的概念,使得它与传统的结构化程序设计明 显地区分开来 2.3.1类的定义 像其它概念一样,我们首先要讨论的是,什么是类? 在日常生活中,我们经常听到“类”这个术语,它是对一组客观对象的抽象,它将该组对 象所具有的共同特征(包括结构特征和行为特征)集中起来,以说明该组对象的能力和性质。 例如“人类”这个词就抽象着所有人的共同之处 在计算机世界的系统构成上类形成了一个具有特定功能的模块和一种代码共享的手 段。它为程序员提供了一种工具,使得他们可以方便地建立所需要的任何类型,并可以像 般类型那样方便地使用。 23.2类与实例的关系 类的概念在前面已经给出,组成类的对象均为此类的实例。 类与实例之间的关系可以看成是抽象与具体的关系。例如我们看到一个苹果就会说: “这是一个苹果”,把它变成我们面向对象系统的语言来叙述:“这是一个苹果类的实例”,再 例如,王东是一个学生学生是一个类,而王东作为一个具体的对象是学生类的一个实例。 类是多个实例的综合抽象,而实例又是类的个体实物