第一章面向对象编程的原理软件危机•如何表示现实实体•如何设计开放接口•如何保证可重用性和可扩展性•如何开发能适应变化•如何开发能提高开发效率•如何提高软件质量•如何管理开发计划•如何让软件开发实现产业化软件质量•正确性•可维护性•可重用性和可扩展性•开放性和互用性•可移植性•安全性•完整性•用户界面友好程度第8章类0面向对象的概述1结构2类3静态成员与友员4构造函数与析构函数面向过程编程图1.1程序=(模块+模块+…)模块=(算法)+(数据结构)•在面向过程的程序中,所有数据是公开的。一个函数可以使用和改变任意一组数据,而一组数据又可能被多个函数使用。这种数据与运算相分离的结果失去了数据的安全性。一旦数据结构发生变化,相关的算法也必须随之改动。对于相同的数据结构,若操作不同,也要编写不同的程序。因此,面向过程的程序代码重用性不好。程序模块的划分,因人而异,缺乏统一的标准,为程序员之间的交流带来诸多不便。另外,面向过程程序设计的逐步细化过程前后关系密切,描述符号不同,一旦先期需求改变,将直接影响后继需求分析的描述,给程序的维护带来诸多不便。•面向过程的程序设计方法本质上是过程驱动的。虽然在处理问题的方法上符合人们思考问题的规律,但它将数据与操作数据的函数分离开来,未能如实地反映客观世界的规律。事实上,客观世界中的事物总是分门别类的。每个类有自己的数据与操作数据的方法,二者是密不可分的。面向对象程序设计•面向对象程序设计的基本思想是现实世界由各种对象组成,任何客观存在的事物都是对象,复杂的对象是由简单对象结合而成的。面向对象程序设计的基石是:类和对象。类是具有相同属性结构和操作行为的一组对象共性的抽象;对象是描述客观事物的属性结构及定义在该结构上的一组操作的结合体。在此,程序被描述为:程序=(对象+对象+…)对象=(数据结构+算法)•对象之间通过消息和方法机制完成相应的操作。•程序员根据具体情况,先设计一些类。每个类有数据成员和操作这些数据的成员函数。然后,定义各个类的对象,并将数据赋给各个对象。对象的数据是私有的,外界只能通过公有的成员函数才能访问该对象的数据。这样就保证了数据的安全性,而且程序员也易于对数据进行跟踪。类的继承性使得每一个新类得以继承基类、父类的全部属性和方法,并加入自己特有的属性和方法,从而使得代码的重用成为可能。类对数据结构和算法的绑定使得程序便于修改和调试,便于程序的维护和扩充。•每个对象是数据和操作代码的完整结合体。各个对象通过消息传递而相互作用。所以,面向对象的程序本质上是事件驱动的。这一点很重要,它使得一个原先很复杂的程序变得简单清晰。这种优势在可视化程序设计中极为明显,如图1.2所示。图1.2基本概念•1.面向对象面向对象是一种认识客观世界的世界观,是从结构组织角度模拟客观世界的一种方法,人们在认识和理解现实世界的过程中,普遍运用以下三个构造法则:(1)区分对象及其属性,如区分车和车的大小;(2)区分整体对象及其组成部分,如区分车和车轮;(3)不同对象类的形成及区分,如所有车的类和所有船的类。2.对象(Object)对象是对一组信息及其上同的操作的描述。如:一辆汽车是一个对象,它包含了汽车的信息(如颜色、型号、载重量等)及其操作(如启动、刹车等);一个窗口是一个对象,它包含了窗口的信息(如大小、颜色、位置等)及其操作(如打开、关闭等)。3.属性(Property)即对象所包含的信息。如:窗口的宽度(form1.width)属性可以在设计对象时确定,也可以在程序运行时读取和修改(如:W=form1.width;form1.width=100)。4.方法(Methord)即对象所因有的各种操作。如:窗口关闭(form1.close)这种操作的过程对外是封闭的,即用户只能看到这一方法实施后的结果。这相当于事先已经设计好的各种过程,只需要调用就可以了,用户不必去关心这一过程是如何编写的,事实上,这个过程已经封装在对象中,用户也看不到。对象的这一特性,即是对象的封装性.5.事件(Event)即对象在执行某一操作后激发并执行的一个或多个过程。这些过程对用户是透明的,用户可以为这个过程编写自己的程序代码,以完成特定的操作。如:窗口对象在执行打开过程时,就会激活一个Active事件(过程),用户可以自己编写这一过程的代码,以便在打开这个窗口时完成一些自己所要求的任务,如打开一个数据库,对某个变量进行初始化等等6.类(Class)与实例(Instance)类是具有共同属性、共同方法、共同事件的对象的集合。而一个具体的对象则是其对应类的一个实例。如果对某一个类的定义进行修改,如增加一些属性或修改一些方法,就得到一个新的类,而原先的类就是新类的父类。如:我们在窗口类的定义上,另外定义它还包含两个按钮,一个标题是确定,一个标题是取消,并且在分别按下这两个按钮后,执行OK与Cancel两个事件。这样就定义了一个新类,我们可以把它叫做选择窗口类,并保存它,这样就可以直接由选择窗口生成窗口实例,而不用每次都由窗口类产生,然后再添加按钮。7.继承(Inheritance)任何一个子类都具有其父类所有的属性、方法、事件。这一特性叫做类的继承。如果父类的特性发生变化,其子类也相应改变。继承机制的优点在于:(1)避免了由于系统内类对象封闭而造成数据和操作冗余的现象。类与其父类、子类构成层次关系,称为类阶(classhierarchy)。利用继承,我们只要在原有关的基础上修改、增补、删减少量的数据和方法,就可以得到子类,然后生成大小、初态不同的实例。(2)接口的一致性(Consistencyofinterface),父类衍生子类的其他操作接口也传递给其子类。(3)符合软件可重用性8.消息(message)面向对象的世界是通过对象与对象间彼此的相互合作来推动的,对象间的这种相互合作需要一个机构协助进行,这样的机构可以称为消息传递。消息传递过程中,由发送消息的对象(SENDER)的使动操作产生输出结果,做为消息(MESSAGE)传送至接受消息的对象(RECEVER),引发接受消息的对象一系列的操作。所传送的消息实质上是接受对象(RECEVER)所具有的操作/方法名称,有时还包括相应参数,图8.1就表示了这样的概念。图8.1消息传递模型例如,一个汽车对象具有行驶这项操作,那么要让汽车以时速50公里行驶的话,我们需传递给汽车对象行驶及时速50公里的消息,以触发这个对象。注意,消息传递机制与传统的过程调用机制的意义是截然不同的,发送消息仅仅是触发对象自动机,有时提供一些附加数据,接受对象响应消息后按照消息模式找到匹配方法,因而同样的输入参数(触发事件)可能因对象状态的不同得到不同的终态(若有输出则结果不同)。而过程调用则相反,只要有相同的输入,输出总是恒定的。但不否认可以借用过程调用机制来实现消息传递,此时只要在匹配方法后考虑到接受对象的当前状态即可。因而,系统可以简单地看作一个彼此通过传递消息而相互作用的对象集合。总之,面向对象的整体概念可具体表示如下:面向对象=数据抽象+数据抽象类型+继承性面向对象程序设计的特征•抽象性----许多实体的共性产生类;•封装性----类将数据和操作封装为用户自定义的抽象数据类型;•继承性----类能被复用,具有继承(派生)机制;•多态性----具有动态联编机制。•面向过程以算法为中心,由算法完成对数据的操作,面向对象技术是以属性为中心,以消息和方法机制完成对对象的操作,对象作为数据而不是作为过程被描述。继承指的是子类继承父类的数据结构和方法,并加入自己所特有的信息,构成新的类,它是父类和子类之间信息关联的一种机制;多态体现在程序运行过程中,不同对象收到相同消息产生完全不同的结果的现象。继承和多态是面向对象特有的要素。面向过程与面向对象两者要素对应关系图1.3