面向对象的程序开发方法_第1页
面向对象的程序开发方法_第2页
面向对象的程序开发方法_第3页
面向对象的程序开发方法_第4页
面向对象的程序开发方法_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

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

文档简介

2.4面向对象的程序开发方法2.4.1面向对象的基本概念思维方式决定解决问题的方式,传统软件开发采用自顶向下的思想指导程序设计,即将目标划分为若干子目标,子目标再进一步划分下去,直到目标能被编程实现为止。面向对象技术给软件设计领域带来极大的变化,它利用软件对象来进行程序开发,所谓对象是包含数据和对数据操作的代码实体,或者说是在传统的数据结构中加入一些被称为成员函数的过程,因而赋予对象以动作。而在程序设计中,对象具有与现实世界的某种对应关系,我们正是利用这种关系对问题进行分解。从程序语言角度来看,在一个对象中代码和(或)数据可以是这个对象私有的,不能被对象外的部分直接访问。因而对象提供了一种高级保护以防止程序被无关部分错误修改或错误地使用了对象的私有部分。当从对象外部试图直接对受保护的内部数据进行修改时,将被程序拒绝,只有通过对象所提供的对外服务函数材能够对其内部数据进行必要的加工,从而保证了数据加工的合法性。从这一意义上讲,把这种代码和数据的联系称为〃封装〃。换句话说,封装是将对象封闭保护起来,是将内部细节隐蔽起来的能力。在强调软件组件的重用方面,面向对象的技术与标准的工业设计规律有更多相似之处。在面向对象语言中,类是创建对象的关键,事实上类描述了一族对象的公共特征和操作,而对象则是具体实现的类。例如小汽车是一个基本概念,它具有颜色、几何尺寸、动力特性的特征。那我们可以定义一个称为"car"的类,具有颜色、几何尺寸、动力特征等参数,以及描述汽车在外界条件下运动状态的成员函数。一辆具体的小汽车则是一个对象,在这个对象中有关参数均有具体数值,并可以通过输入说明变量(外界条件参数)获取该车具体运动状态。C++和Smalltalk是广泛被接受的面向对象的程序设计语言,在欧洲Eiffel拥有一批追随者,而Ada9X通过附加多态性和继承性,将把Ada语言全面引入面向对象的世界。面向对象技术给软件发展带来如下益处:*可重用性。从一开始对象的产生就是为了重复利用,完成的对象将在今后的程序开发中被部分或全部地重复利用。*可靠性。由于面向对象的应用程序包含了通过测试的标准部分,因此更加可靠。由于大量代码来源于成熟可靠的类库,因而新开发程序的新增代码明显减少,这是程序可靠性提高的一个重要原因。*连续性。具有面向对象特点的C++与C语言有很大的兼容性,C程序员可以比较容易地过渡到C++语言开发工作。面向对象语言具有如下基本特征:*访问控制。对象必须能够对其内部的某些元素进行保护,是它们只能被内部使用,而不受外部干扰。反过来,对象又必须同其它外部元素进行联系,以便对对象进行操作。在C++中,类有私有的(private)、保护的(protected)和公有的(public)三种访问机制。*继承性。通过对已有对象进行增加或部分修改的方法建立新的对象,对已有对象可以增加数据和过程,也可以对其中某些过程进行从新定义。最初的类被称为基类,从基类扩展出来的类称为派生类。从已有类派生出新类是为了获得更强的针对性。*多态性。正象生态系统一样,继承构成了类族。通常这些类族中的类具有同名的成员函数,例如OD分布类族,具有一个通用基类,两个派生类:增长系数OD分布类和重力模型OD分布类,这几个类都有同名的Exec成员函数。多态性意味着存在多种形式,能使人们在程序中激活任何属于OD分布类族的类的Exec成员函数,甚至在编译可以不必具体知道对象是属于增长系数OD类还是重力模型OD分布类。面向对象体系结构技术有助于创建行业性软件开发机构。例如交通规划尽管具有差别,但各城市所需要的软件基本上是相同的,这就为软件开发机构提供了一种制作面向交通规划的软件框架(注意这里讲的是软件框架而不是通用性软件)的机会。这种框架一旦开发成功,就可以多次反复利用。面向对象技术特别适合于将某一领域内的软件资源整理成体系化,因为它有很好的表现能力,能够容易抓住特定功能领域的本质。2.4.2面向对象的程序设计为有效使用面向对象的程序方法,首先需要解决程序的结构设计问题。在程序设计过程中最重要的抽象,也就是说,从现实世界中抽象出合理的对象结构。在面向对象思想中,抽象决定了对象的对外形象、内部结构以及处理对象的外部接口,其关键是处理对象的可见外部特征。封装是与抽象紧密联系的概念,它需要两个基本前提:首先,对象必须能够表现一个完备的概念,例如可以将一条道路的纵断面设计作为一个对象,它与外部的联系限于纵断面地面线、纵断面设计参数。当这些外部条件给定之后,对象可以独立计算任意桩号的设计高程、地面高程、设计高差、填挖面积等,也可以根据给定的比例和初始坐标计算设计线和地面线的图形坐标。第二,对象的私有性,例如上述示例中,对象的内部数据结构在外部是不可见的,其他程序员并不需要了解这种数据结构就可以使用对象的功能。对于对象的接口设计是十分重要的,它必须给出必要的访问渠道,同时必须尽可能地将内部细节隐藏起来。我们可以将接口看作是在屏蔽墙上打开的一些出入通道,通道过多了就失去了屏蔽墙存在的意义,通道过少又由于限制过强而行动不便。一般情况下,这种通道表现为一组接口函数,事实上我们也可以将一些变量作为对外开放的,但这并不是一种很好的方法。面向对象设计方法的另一个重要贡献,是关于继承与多态性的处理。所谓继承是指从现存对象出发建立一个新的对象类型,使它具有原对象的特点和功能,这称为〃派生"。同时,新的对象类型又具有某种新特点和新功能。这样,我们可以采用对象派生的方法建立一个有层次的对外部世界的描述。例如,在第三章中我们可以看到一组有关三维曲面分块的类族,从四条三维空间直线定义的简单曲面,到四条复杂三维空间曲线定义的曲面,呈现复杂的分层次的多态性。但他们都有共同的接口函数形式:例如根据给定平面点计算高程等。2.4.3采用面向对象方法进行程序开发的示例为了进一步帮助读者了解面向对象的程序开发方法,我们在此介绍一个应用示例,我们的目的是帮助理解这种方法,而不是具体教会读者立刻能够编程,因此这里使用的是不那么严密但易于理解的表述。为支持交通规划决策支持系统、道路项目可行性研究决策支持系统开发,建立了一个基础类库,库中包含了大量的专用工具。这个类库中有一个用于管理道路或交通网络数据的类族,它为交通分配、数据检查、图形输出等多个子系统提供支持。作为整个类族的基础,建立了一个拓扑网络,它只描述节点之间的连接特性,各边均没有长度、等级等方面的特性。对于这个拓扑网,建立了整个类族的基础-基类NetworkManager,其具体定义如下所示:【清单2—5】NetworkManager的说明classNetworkManager{本类管理拓扑特征的网络,在本网络中各边没有长度、等级一类的参数。这构成了所有网络类的基类。protected:...public:构造函数及析构函数...

存序号intGetSetFlag(void);intNWAlloc(void);voidSetNetworkType(voidSetMaxLink(intvoidSetMaxNode(intinttype););intn2););intSetNetwork(intn1,intSetEnd(void);voidReverse(void);GetNumLink(void);GetNumNode(void);GetLinkStat(intn1,intn2);GetLink(intn1,intn2,intintintintintintint存序号intGetSetFlag(void);intNWAlloc(void);voidSetNetworkType(voidSetMaxLink(intvoidSetMaxNode(intinttype););intn2););intSetNetwork(intn1,intSetEnd(void);voidReverse(void);GetNumLink(void);GetNumNode(void);GetLinkStat(intn1,intn2);GetLink(intn1,intn2,intintintintintintintintintno);获取设置状态标志进行系统内存分配设置网络类型设置最大边数设置节点的最大编号X在网络中增设一条边网络数据设置完成后的处理将网络中的所有有向边反向获取网络中的边数获取网络中的节点数获取两指定节点间有几条连接边获取指定节点间第no条边的内存序GetNode1(intl);GetNode2(intl);GetNumOutLink(intn);GetOutLink(intn,intno);获取内存序号为l的边的起点编号获取内存序号为l的边的终点编号获取以节点n为起点的边的数量获取以节点n为起点的第no条边的内intintGetNumInLink(intn);GetInLink(intn,intno);获取以节点n为终点的第no条边的内存序号};一个是说明符"protected一个是说明符"protected:"以下直到说明符"public:”,这里略去了其中的内容。实际上这里有一些数据的定义,以及内部函数的定义。但对于外部调用来说,这些内容都是不可见的,以防止使用者无意中对这部分内容进行了错误的操作。这就是类的屏蔽。而在说明符"public”以下列出的函数均是对外开放的服务函数,从外部可以调用它们获得所需的支持。在这些函数中GetNode1(边的编号)、GetNode2(边的编号)、GetNumOutLink(节点编号)、GetOutLink(节点编号,边的相对序号)、GetNumInLink(节点编号)、GetInLink(节点编号,边的相对序号)等是真正提供我们非常需要的服务功能的函数。它们分别可以通过给定边的编号查询该边的起(终)点编号,根据给定节点的编号查询从该节点出去或进来的边的编号,以及查询给定节点出去或进来的第i条边的编号。这类函数还有Reverse(void)、GetNumLink(void)、GetNumNode(void)、GetLinkStat(intn1,intn2)、GetLink(intn1,intn2,intno)等。而SetNetwork(intn1,intn2)起的作用是告诉类网络中的某一条边的起点和终点,换句话说是将外部的数据输入到NetowrkManager中间去。由于这种处理方法,这个类与具体数据形式脱钩了,从而增强了其通用性。调用者可以根据具体情况从数据文件或数据库中获取网络数据,而后通过调用SetNetwork一条边一条边地把数据送进网络管理类中。这类函数还有SetNetworkType(inttype)、SetMaxLink(intn)、SetMaxNode(intn)等。类族结构如图2-1所示,从NetworkManager逐步派生出整个类族。CTPSNetworkForWin与CTPSNetworkForDOS在内存申请处理方面有所区别,分别为Windows和DOS环境下的程序开发提供服务,与NetworkManager相比,对各边增加了长度和等级的特征值。CTPSNetworkCost新增加了有关各边的费用函数处理功能,以及能够对各边进行流量、运行

车速等数据存取。Network-Cost与其父类相比,增加了一些有关网络总体状态合计处理的功能,例如计算整个网络的车公里合计值等。NetworkNode则是在节点上增加了数据存储功能,因而能够记录节点的坐标值等数据。NetworkFlowNode也是增加了节点数据的存储处理功能,但由于其父类的不同,因而能够处理许多有关流量的信息。图2-1网络类派生关系图我们进一步以CTPSNetworkForWin为例,说明派生类与父类之间的关系。在以下列出的定义说明中,我们可以看到在派生类中仅增加了一些新函数。对于父类已有的对外服务函数,派生类仍然可以继续使用。也就是说,派生类是在父类的基础上,增加开发一些新功能而建立的。这就使得我们能够根据需要逐步通过派生的方法建立即有相同功能,又有所区别的类族,以满足不同的要求。【清单2—6】CTPSNetworkForWin的说明classCTPSNetworkForWin:publicNetworkManag{//本网络类是针对Windows环境所开发的派生类,与NetworkManag相比,网络边增加了长度及等级特征。public:构造及析构函数...intSetLinkLength(intn1,intn2,intno,doublex); /置指定节点设间第no条边的长度//根据边的内存序号设intSetLinkLength(intn,doublex);//根据边的内存序号设置长度intSetLinkClass(intn1,intn2

温馨提示

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

评论

0/150

提交评论