面向对象程序设计的历史及发展
姓名:郭一恒班级:0901学号:2009302540014
自从计算机发展以来,程序设计的方法为了适应越来越复杂的程序设计的需要而发生了急剧的变化。计算机刚问世时.程序设计是通过计算机的控制板用二进制机器指令打孔完成的。随着程序设计的发展,产生了汇编语言,程序员用助记符号代替机器指令,能够处理更大更复杂的程序。随着计算机处理事物的越来越多,产生了高级程序设计语言,它们给程序员提供更多的处理复杂事务的工具。但它们不是支持结构清晰、易于读懂的程序设计语言。60年代诞生了结构化的程序语言,这就是者如c语言和Pascal语言支持的方法。结构化程序设计语言的应用使得有可能较容易地编写复杂程度适中的程序。一旦达到一定的复杂程度度,使用结构比的程序语言也会无法控制,其复杂程度已远远超过了程序员的管理所及。如今,许多程序没汁语言已经或达到了结构化程序设汁方法的极限。应运而生的面向对象的程序设汁方法就是为了解决这类问题的。面向对象的程序设汁方法汲取了结构化程序设计方法的先进的思想,并把它同支持用户用新方法进行程序设计的概念结合起来。所有的面向对象的程序设计语言一般都包含三个最基本的概念:对象、继承性和多态性。
一、面向对象程序设计的历史
面向对象程序设计方法作为90年代程序设计的新思想、新方法,已经和正在给计算机界带来一场深刻的
革命。实际上,对面向对象程序设计方法的研究由来已久。早在本世纪40年代,在对数字模拟的分析研究中就引入了“对象”的概念,随后在对模拟系统的分析中,大量的模拟仿真语言,如Simscript、GPSS、CSL和SimulaⅡ,为此应运而生。在Simula Ⅱ中的“活动(Activity)、过程(Process)”概念正是如今OOPL中“类”和“对象”概念的雏型。60年代中期,随着SimulaI中不断引入子类、模块、封装等新概念,导致了Simula67,Modula—2等具有OOP特点的一些模拟仿真语言的出现,它们被称为OOPL的祖先或前身。随着70年代结构化程序设计、软件工程和人工智能技术的飞速发展,促使人们去寻求信息隐藏、抽象数据类型、代码共享等更丰富的能表达高层概念和抽象数据结构的手段。终于在70年代初期,以Smalltalk为代表面的面向对象的程序设计语言(环境),在Simula67和Modula—2的基础上,正式诞生了。Smalltalk作为一种纯面向对象语言对OOPL的发展曾起过重要作用。但近年来,由于世界各国计算机界对OOP方法的广泛重视和关注,在理论和实践方面取得不少进展和突破,并已开发出数十种面向对象语言。自80年代国外大规模开展面向对象程序设计方法学OOPM研究以来,已形成多层次、多侧面OOPM研究领域,而引起计算机科学界(数据库、AI、软件工程等)的广泛兴趣和关注。OOPM涉及的研究领域有:1.对继承语义、计算反射、高阶数理逻辑、基于约束计算、面向快速原型、面向对象语义模型等方面的OOP理论研究。
2.各种不同风格(纯、混合型和并发型)的面向对象程序设计语言。
3.从软件生命周期出发,研究面向对象概念在软件的说明、分析、设计、编码、测试等阶段应用面向
对象软件工程(OOSE)。
4.面向对象数据库管理系统(OODBMS)及面向对象数据库(OODBS)的实现。
5.面向对象系统的应用,包括CAD/CAE/CAM/CASE、动态模拟、人机界面、OODB、专家系统、仿真系统和基于窗口的面向对象的操作系统。由于OOP思想被认为是新一代结构程序设计,因此从更高的层次和角度研究面向对象的方法及面向对象数据库系统的实现,在当前具有十分重要的意义。
以下列举一些较为典型和有名的面向对象程序设计语言:
1.Smalltalk该语言是1972年美国Xerox公司PaloAtlo研究中心为快速处理各种信息而在Alto个人机上研制的软件,于1983年正式发行Smalltalk(V.2.0)。Smalltalk 被认为是最纯的面向对象的语言。该语言只有一种数据类型——对象,但严格地讲,Smalltalk可视为一种程序设计环境。尽管该语言没有得到普遍推广,但它的问世标志着OOP 研究的开始,正是它所开创韵OOP方法把结构化程序设计的抽象层次又提高了一层,对程序设计方法产生了深刻的影响。Smalltlk在OOPL中的地位相当于UNIX在OS中的地位,它体现的纯粹OOP思想,在当前OOP的有关术语、概念不尽一致的情况下,被奉为OOP的经典和入门。
2.C++是C语言的一个超集,它是在保持与C语言兼容的基础上,增加了继承和多态等面向对象特性而实现的一种OOPL。C++中的派生类(Derived Class)是C++实现继承的手段。在C++中允许一个类继承另一个类的全部或部分属性(或方法)。被继承的类称为超类(基类或父类),执行继承的类就称为派生类(或子类)。C++具有多重继承特性,即一个类可继承多个超类的属性和方法。由于C++允许派生类可以继承或修改它的超类(父类)的全部或部分的方法,并可以扩充超类中没有的新方法,这就为裁剪、修改、扩充超类(父类)提供了一种重要手段。继承机制是一个强有力的编程工具,它大大降低了软件开发的复杂性和费用,并使软件系统易于扩充。多态性(Polymorphism)是C++提供的另一个重要概念和特性。多态指它允许把同一消息发送给超类及其子类的所有对象的能力。实际上,“多态”就是用同一名字定义功能相近但在实现上又略有差异的一组函数。它使得以不同方法来完成同一目的一组函数具有相同的接口。多态的重要性在于允许超类及各子类的对象各自以不同的方法响应同一消息,即所谓“同一接口多种方法”。多态性可分为编译时多态和运行时多态。前者在编译阶段即能选择、确定操作的代码;后者在运行过程中根据接受消息的对象去选择与之相关的特定方法。编译时多态由于编译程序可在运行前对代码进行优化而在速度上具有优势,但运行时多态由于其具有灵活性及较良好的可扩充性使之更加体现出OOP的优越性。早期的OOPL 都是解释型的,因此只能在运行时刻才支持多态性。而C++是编译型的,它既支持编译时多态性,也支持运行时多态性。在C++中,编译时多态性是由重载函数或运算符来实现的。将若干个功能相近的函数定义成同一个各字称为函数重载。使某运算对某一类具有特定含义,称为运算符重载。重载后的运算符仍保持其原来的含义。在C++中,运行时多态性
是通过派生类和虚拟函数实现的。虚拟函数是一种在超类中定义为Virtual,并可在一个或多个派生类中重新定义的函数,由于指向超类的指针可以访问其任一派生类的对象,因此就能在运行时根据指针所指向的对象(超类对象或某一个派生类对象)来选择执行虚拟函数的不同版本,而获得运行时的多态性。继承机制和多态性相结合,使C++充分发挥了OOP的特点而成为一个名符其实的OOPL,加之,C++与C完全兼容,使该语言可直接作为一个AI及先进的软件开发工具来使用。
3.混合型面向对象程序设计语言混合型面向对象程序设计语言(Hybrid Object Oriented Programming Language)是指将面向对象范例与另一种或多种范例(如过程型、函数型、逻辑型等)相结合而构成的面向对象程序设计语言或环境。如目前在AI中,将OOPL 与AI语言相结合的研究有两种趋势:一是在已有的AI语言环境中引进(加入)面向对象的程序设计风格,而构成混合型OOPL。如LOOPS、CommonLOOPS、CommonObject、Oaklisp等都在LISP语言的基础上,加入OOP特点而实现的混合型OOPL,二是在基于面向对象的程序设计环境的基础上,把多种Al程序设计语言的特性(甚至包括多种知识表示等)有机地结合在一起,构成各种新型的Al语言或知识工程及其它软件开发工具。如LOOPS、KEE、Flavors、Orien84/K、G—LOG!S和FOOPLOG等。以KEE(知识工程环境)为例,这是Intellieorp公司于1983年推出的·组合型信息工具。它是在用框架概念实现的UNITS的基础上开发的。它实现了逻辑程序设计与合一原理及组合原理的相互结合。KEE作为一个混合OOP系统,它将
OOP、产生式规则、函数型LISP语言、框架等多种AI概念很好地融合在一起。KEE还具有十分丰富的
窗口、图形显示的友好用户界面。此外,它还通过一组仿真工具SIMKIT来完善系统,使KEE环境可把产生式规则和仿真技术相结合,以实现“智能”仿真。又如G—LOGIS 是在VAX—11上开发的混合型OOPL,它是将逻辑型PROLOG和函数型LISP相结合构成的多范例程序设计环境。适用于实现专家系统、OODBS等。
4.并发性面向对象程序设计语言所谓并发性OOPL,是指具有并发机制的OOPL,它按OOP的语义,将其看成一种并发计算模型,并因此开发OOPL的并发性,以扩展其并发表达和处理能力。如Actors、ABC/I、CST(并发Smalltalk)等均为并发性OOPL,这类语言对实现分布式系统具有重要意义。如ACT1、ACT2这种称为角语言的并发性OOPL,是在以HEWITT 角理论及PLASMA语言基础上研制的一种OOPL。它们是建立在角和消息传递协议两概念之上,是一种完全面向多任务和并行机制的多处理机的计算机语言。在角语言中,例示、类、元类等都被唯一一种概念——角所代替。ACT1是基于科学研究目的而提出,ACT2是在ACT1和OMEGA基础上研制和派生出的另一种并发性OOPL,它吸取了诸种语言的优点,在使用上更加灵活方便。又如并发Prolog是1972年由日本开发的,其原始目标并非针对OOP,但由于它提供了不完全消息,合一、直接广播发送和并发同步等功能,从而成为将逻辑与面向对象范例相结合的一种并发性OOPL。此外,尚有由YasuhikoYokote等依据并发结构和原子对象概念而开发的Smalltalk—80并发性OOPL。该语言的基本思想是将对象和进程的概念合二为一,即并发对象。这样,系统可模拟一组并发对象的合作运行,从而使该语言能充分利
用Smalltalk—80的功能,与其兼容,使用户能自然地利用并发机制模拟并发问题,体现并发处理的透明性。最后要提及的是AUM语言,这是一种将OOP、关系模型和流计算模型三者合为一体的并发型OOPL。
5.面向图象处理和面向知识处理的OOPL这是按应用领域划分而确定的一类OOPL。如GARDEN即为一仲面向图象处理的OOPL环境,它应用面向图象和多重视图的概念,使程序员能采用图象程序设计方法直观地进行概念化设计,该语言代表了新一代OOPL的主要特征,对开发多窗口的操作系统和多媒质计算机软件具有重要意义。Orien—84k则是一种面向知识处理的OOPL,它在其面向对象的框架中提供了面向对象、面向逻辑及规则、面向幽灵(Demon)和并发程序设计的多种不同的程序设计网络,可把几个不同的概念,如对象、逻辑和幽灵结合到一个更一般的概念——知识对象(Knowledge Object)中,使之具有统一的模块化单元知识对象,能实现多级模块化和并发程序设计。该语言适用于知识库处理等各类AI 应用系统。
pascal语言面向对象吗
二、面向过程的程序设计与面向对象的程序设计
“面向对象”就是把客观世界中的事物看成一个个互相联系的对象,每个对象都有其静态属性和相关的操作。作为一个整体,这些对象对外不必公开这些属性与操作。这种看问题的方法和人们认识客观世界的过程是一致的。相反传统的结构化语言都是按面向过程的思路来进行程序设计的。因此人们提出了
面向对象程序设计方法,以求问题空间和求解空间在结构上尽可能一致。在面向过程的程序设计中,程序被分为一个主模块和若干个子模块。程序设计人员在设计时,必须从代码的第一行一直编到最后一行。在执行时,控制流程从第一行代码开始,顺序向下执行(除了遇到特殊的流程控制语句以外),直到最后一行代码结束。这种方法的时间顺序性强,但增大了程序工作量,增加了编程中的麻烦和琐碎的工作,并且降低了程序的运行效率。同时由于割裂了数据和代码这两个要素,导致可维护性和可重用性很差。在面向对象的程序设计中,程序设计人员主要考虑如何创建现实世界中可能存在的对象,依此构造出相应的数据模型,展示对象间的相互关系,并编写相应的程序。对象包含数据和作用于数据的操作,对象可以自行执行,也可以被来自其他对象的消息激活。具有同一用途
的对象被组织到一个类中,新的类可以被建立,并且新类可以从已建立的类中继承数据和方法,使得程序员能够重用已存在的类,而只需设计相异之处。和面向过程的程序设计相比,面向对象程序设计具有以下3个优点:
(1)开发更快程序设计人员一但已开发了可重用的类库,开发就快多了。虽然开发这些类可能用些时间,但可以在以后的系统中重复使用这些类。或者也可以购买类库,在其上作少量的修改生成自己的类集,这样只需自定义类而没有必要修改源代码。
(2)更易维护。更易维护是由于对象的封装性。面向对象程序设计使程序的数据(类成员变量)和处理该
数据的函数(类方法)能整个地封装进对象里。由于封装,使数据和函数更紧密地结合在一起,使得面向对象程序设计代码比面向过程程序设计代码更安全,更容易阅读和维护。
(3)更高的质量和适应性从理论上来说,从类库中产生的程序更可靠。这些类库是被测试过并且认为是高质量的。这些资源,加上子类的功能以及不必拆开已有代码就进行修改的特点,这样产生的新系统肯定是高质量,并且更易于适应新应用。
三、面向对象程序设计的基本概念
1.类、对象、控件
(1)类在现实世界中,人们习惯于把具有相似特征的事物归为一类。在面向对象的技术中,类是描述某类型数据的所有属性(特性)和行为(方法)的模板。一个类所包含的方法和数据描述一组对象的共同行为和属性。类是在对象之上的抽象,类可以有子类,同样也可以有父类。
(2)对象在面向对象的系统中,对象是基本运行时的实体。对象是类的具体化,是类的实例。在应用领域中有意义的、与所要解决的问题有关系的任何事物都可以称作对象。它既可以是具体的物理实体的抽象,也可以是人为的概念,或者是任何有明确边界和意义的东西。例如一名学生、一所学校、一个表单、一个按钮等都可以作为一个对象。在面向对象程序设计中,设计人员首先要考虑的是如何创建
对象,利用对象来简化程序设计。由于客观世界中的实体通常都既有静态的属性,又具有动态的行为,所以在面向对象程序设计中的对象是由描述该对象属性的数据以及可以对这些数据施加的所有操作封装在一起而构成的统一体。在面向对象系统中,对象是主体,而且对象是以数据为中心,其操作是围绕着数据来展开的,没有无关的操作,因此,对象内部的各种元素之间彼此结合得很紧密,对象的独立性很好。所以面向对象的程序设计提高了程序的可读性、可维护性和可重用性。
(3)控件也是一种对象,只是在实际应用中,为了使用方便,将一些特殊的对象进行更严密的封装,定制成用以显示数据、执行操作的一种图形对象。控件包括复选框、编辑框、标签、命令按钮等。
2.属性、事件、方法属性
(1)属性就是类中所定义的数据,它是对客观世界实体所具有性质的抽象。每个对象都有自己的属性。例如,每个学生都有自己的学号、姓名、性别、年龄等属性,一个复选框具有自己的位置、标题文本的颜、是否可见等。对象的属性由对象所基于的类决定。属性值既能在设计时设置也可在程序运行时进行设置。
(2)事件是某个特定的时刻所发生的事情,它是对对象状态转换的抽象。事件没有持续时间,是瞬间完成的。事件是由对象识别的一个动作。在面向对象的程序设计中,每个对象都可以对一个被称为事件的动作进行识别和响应。用户可以编写相应的代码来对此动作进行响应。
(3)方法就是对象所能执行的操作,也就是类中所定义的服务。方法描述了对象执行操作的算法,是执行对象数据操作的一段代码,通过向对象发消息来激发。消息是让对象以某
种方式进行操作的请求,要触发方法或查询对象数据,首先必须向对象发消息。消息通常包括对象的名字,随后是属性或方法名,以便对象知道如何执行。方法是与对象相关联的过程,紧密地和对象连接在一起。
3.继承、封装、多态
(1)继承在面向对象程序设计中,可以用继承来定义具有相似属性的类。从现有的类建立新类的过程被称作继承。继承提供了新的派生类(或子类),它具有包含在父类内的全部功能和扩展新类的能力,然后还可以在此基础上添加其他控件和功能。继承带来如下好处:
①软件的重用。这表现在两方面:其一是通过实例实现所有事实对象的利用。其二是通过继承现行软件以重复使用。如果一个操作是从另外一个类中继承来的,这个操作的所有源代码就可以不用重新写了。从这一点来看,其作用是深远的。在传统的程序开发中,要花费大量的时间来重复编写代码,而使用继承以后,就可以只写一次代码,然后重复使用。
②减少代码。在面向对象的技术中存在多层次的代码复用。在一个层次上,许多不相干的程序及项目可以使用相同的类,不必重新编写类似的程序代码。
③界面的一致性。在面向对象的程序设计中,用户可以首先生成一个具有共性的界面对象。对于形式上要求一致的界面,可以使用继承来解决这个问题。另外对于各具特的界面对象,只要它继承了具有共性的对象后,再添加自己的特属性、事件和方法即可。继承即可以保持界面的一致性,又可以优化编程方式,可谓一举两得。
④合理的代码维护。由于有继承性,就可以使在一个类上所做的改动反映到它的所有子类当中。如果设计完一个应用系统后,因为某种原因发现了类中的小问题,只修改该类就可以将这个改动反映到所有子类中,这种自动更新可节省用户的时间和精力。另外,每一种面向对象的语言还都带有大量的类库,以支持更强大的编程能力。这些基本的类库主要是由系统厂商提供。在实际的编程过程中,可由基本类库派生出满足不同需要的子类。而在对子类的引用时不必知道基类是如何实现的,通过继承,子类会自动拥有基类的功能。
(2)封装是一种组织软件的方法。它的基本思想是把客观世界中联系紧密的元素及相关操作组织在一起,构造出具有独立含义的软件,把相互关系隐藏在内部,对外仅仅表现出与其他封装体之间的接口。封装的目的是信息隐藏,把对象的内部代码隐藏起来。用户只需知道该对象具有什么功能以及如何使用该对象,而不必了解这些功能是如何实现的。不过,信息隐藏是原则,而封装是针对这一原则的实现。在开发一个软件系统时,封装使得构造和组织系统更准确、方便并且能减少重复的工作。封装能把相关的内容组织起来,使程序的不同部分之间的通信减少到最少。把程序中易变的部分局部化,
是基本的封装技术。在面向对象的程序设计中提出了一种全新的封装方法:类和对象。对象是按照封装的方法构造的、与客观世界具体成分相应的软件模块。对象中所封装的内容是描述这些客观世界具体成分的一组数据(称为属性)及这些数据上的一组操作(称为事件和方法)。类作为对象的抽象及描述,具有统一的属性和操作。在类中必须给出生成一个对象的具体方法。
(3)多态性面向对象程序设计的一个重要特性是不同类型的对象对同一个函数的调用是不同的。在层次中对同一消息不同对象的响应称之为多态。多态性的作用在于:它使高层的代码只写一次,而通过提供不同的底层服务来满足复用的要求。在面向对象的程序设计中,各种动态性方法以及其他方法结合使用可以大大提高代码复用。
四、结语
可见,面向对象设计方法以对象为基础,利用特定的软件工具直接完成从对象客体的描述到软件结构之间的转换。这是面向对象设计方法最主要的特点和成就。面向对象设计方法的应用解决了传统结构化开发方法中客观世界描述工具与软件结构的不一致性问题,缩短了开发周期,解决了从分析和设计到软件模块结构之间多次转换映射的繁杂过程,是一种很有