天天看点

浅谈“面向对象”

摘要:面向对象(Object Oriented,OO)是当前计算机界关心的重点,它是90年代软件开发方法的主流。面向对象的概念和应用已超越了程序设计和软件开发,扩展到很宽的范围。如数据库系统、交互式界面、应用结构、应用平台、分布式系统、网络管理结构、CAD技术、人工智能等领域。 起初,“面向对象”是专指在程序设计中采用封装、继承、抽象等设计方法。可是,这个定义显然不能再适合现在情况。面向对象的思想已经涉及到软件开发的各个方面。如,面向对象的分析(OOA,Object Oriented Analysis),面向对象的设计(OOD,Object Oriented Design)、以及我们经常说的面向对象的编程实现(OOP,Object Oriented Programming)。 谈到面向对象,这方面的文章非常多。但是,明确地给出对象的定义或说明对象的定义的非常少。许多有关面向对象的文章都只是讲述在面向对象的开发中所需要注意的问题或所采用的比较好的设计方法。看这些文章只有真正懂得什么是对象,什么是面向对象,才能最大程度地对自己有所裨益。这一点,恐怕对初学者甚至是从事相关工作多年的人员也会对它们的概念模糊不清。 关键字:面向对象 面向过程 程序设计

对象 类 继承 封装 多态性 消息

我的专业是计算机,最先接触“面向对象”这个词是在学习c++的过程中,那个时候还不明白到底什么是“面向对象”,非常的不解。后来随着学习的深入,专业课的不断增加,发现“面向对象”这个词在计算机领域可以说有着非常的地位,代表了线代软件开发方法的主流方向,几乎任何一门学科都有涉及这个词。随着学习的深入,对“面向对象”这一概念接触的较多,我也对“面向对象”这一概念有了初步了解,所以愿意跟大家一起分享一下我的小小心得。

那么到底什么是“面向对象”呢?在程序设计中,“面向对象”又有着什么优势呢?

“面向对象”这个词在程序设计领域是涉及最多的。说到程序设计,学过编程的人都知道,不过对于没有学过编程的人,我们就有必要了解一下什么是编程语言。现在我们使用的计算机都是装了大量软件的,而软件又几乎百分之百都是用编程语言编写的,比如c++,java,PHP,phyton等,而我们都知道计算机是二进制的,也就是说计算机只能识别0和1,那么编程语言又是怎么在计算机上工作的?这些都是需要解释的,下面我就详细为大家介绍一下什么是编程语言以及编程语言是如何在计算机上工作的。

早期的计算机只有机器语言,也就是我们通常所说的二进制码,用户必须通过二进制码表示的机器语言编写程序(也可以是八进制或十六进制),我们可以想象得到,这样的工作量大,而且非常容易出错。所以对程序员的要求也是非常高的,他们必须对计算机的硬件以及该计算机的指令系统有着正确和深入的理解,必有熟练的编程技巧,也就不难想象,这么高的要求只有少数的几个专家才能达到。

后来,又出现了符号式程序设计语言,也就是大家经常听到的汇编语言。此后,程序员就可以用诸如ADD、SUB、MUL、DIV等符号来表示加减乘除的操作码,并且用符号来表示指令和数据的地址。当然,汇编语言程序的大部分内容都是和机器指令一一对应的,用户(一般指程序员,因为一般人不会汇编)用汇编语言编写程序后,计算机就把汇编语言编写的程序翻译成计算机可以识别的机器语言(也就是二进制码),然后在机器上运行。这个翻译的过程通常是由汇编实现的。

可以把一台具有汇编程序的计算机看作是在实际机器级(硬件)之上出现的一台虚拟机,这台机器允许使用汇编语言编写程序。称他为虚拟机器是因为他依靠了软件(汇编程序)才实现。

由于汇编语言的语法、语义结构仍然同机器语言基本一样,而与人的传统阶梯发放相差甚远,因而经过了人们的努力最终出现了面向题目的高级语言。随同研制出来的是这些语言的翻译程序,也就是说在汇编语言级的基础上又出现了高级语言级,它的实现过程是先把高级语言翻译成汇编语言或中间语言程序,然后再翻译成机器语言程序。现在的程序设计一般是指高级语言编程设计,分为面向过程的和面向对象的。

至此,我们终于看到了“面向对象”一词。

面向对象的程序设计开发方法是近几年才开始流行起来的。传统的程序设计是面向过程的,其核心是功能的分解。传统的面向过程的程序设计,首先采用自顶向下,逐步细化的发放讲问题分成若干模块,然后再根据功能模块设计数据结构,最后,编写对数据进行操作的过程或函数。在这种方法中,数据和施加在数据上的操作是分开的,在大型的结构化程序中,一个数据结构可能被多个过程处理,数据结构的改变将导致相关模块的修改,程序可重用性( 重用性是指同一事物不经修改或稍加修改就可多次重复使用的性质。软件重用性是软件工程追求的目标之一)差,开发和维护代价高。这时候,作为一种降低复杂性的工具,面向对象语言产生了,面向对象程序设计也随之产生。 1967年挪威计算中心的Kisten Nygaard和Ole Johan Dahl开发了Simula67语言,它提供了比子程序更高一级的抽象和封装,引入了数据抽象和类的概念,它被认为是第一个面向对象语言。20世纪70年代初,Palo Alto研究中心的Alan Kay所在的研究小组开发出Smalltalk语言,最早出想的比较完善的面向对象的程序设计语言是1981年美国XEROX公司的Palo Alto研究中心推出的Smalltalk-80,Smalltalk-80被认为是最纯正的面向对象语言,它几乎包含了面向对象技术的核心元素并由此提供了支持面向对象开发的基本机制,它对后来出现的面向对象语言,如Object-C,C++,Self,Eiffl都产生了深远的影响。可以说Smalltalk-80的出现印发了计算机软件领域的一场深刻变革。随着面向对象技术的出现,面向对象程序设计也就应运而生且得到迅速发展。之后,面向对象不断向其他阶段渗透,1980年Grady Booch提出了面向对象设计的概念,之后面向对象分析开始。1985年,第一个商用面向对象数据库问世。1990年以来,面向对象分析、测试、度量和管理等研究都得到长足发展。现在,面向对象的程序设计已经发展的相当完善了。新出现的语言如java更是摒弃了面向过程的元素,完全以面向对象设计。

那么,到地什么是面向对象呢?

虽然谈及面向对象的文章非常多,但是明确地给出对象的定义或说明对象的定义的非常少。软件工程学家Coad和Youydon曾给出一个简单定义:

面向对象=对象+类+继承+通信

如果一个软机系统使用上述四个概念设计并加以实现,则认为这个软件系统是面向对象的。

面向对象技术的基本观点可以概括如下:

、客观世界有对象组成,任何客观实体都是对象,复杂对象可以由简单对象组成。

、具有相同数据和操作的对象可以归纳成类,对象是一个类的实例‘

、类可以派生出子类。子类除了继承父类的全部特性外还可以有自己的特性。

、对象之间的联系通过消息传递来维系。由于类的封装性,它具有某些对外界不可见的数据,这些数据只能通过消息请求调用可见方法来访问。

下面我通过几个例子来介绍面向对象的几个核心元素。

1.对象:客观世界里的任何一个实体都可以称之为对象。对象可以是有形的也可以是无形的,可以是具体的人、汽车等,也可以是抽象的规则,事件,计划等。在面向对象的 过程中对象是必不可少的,复杂的对象可以由简单的对象组成。

2.类:封装了一类对象的状态和方法,是一组具有相同数据结构和相同操作的对象的集合。类是对象的抽象,好比是一个模板,基于类可以生成多个具有不同属性值的对象。

3.封装:封装是面向对象方法的一个重要原则。封装是指把属性和操作封装进一个对象里,它的内部信息对外界是隐藏的,不允许外界直接存取对象的属性,只能通过对象提供的有限的接口对对象的属性、数据进行操作。对于外界来说,只能知晓对象的外部行为而无法了解对象行为的内部实现细节,这样就保证了对象内部属性数据的安全性。封装的目的就在于将对象的使用者和对象的设计者分开,使用者不必知道行文实际的细节,只需要设计者提供的消息来访问该对象。把定义模块和实现模块分开,可以大大提高软件的可维护性、可修改性。面向对象的核心思想之一就是将数据核对数据的操作封装在一起。通过抽象,即从具体的实例中抽取共同的性质形成的一般概念,比如类的概念。

举一个简单的例子:在实际生活中,我们每时每刻都与具体的事物在打交道,比如卡车、汽车、轿车等,这些事物都有以下的几个属性:可以装多少人,速度,功率,耗油量,车身自重,有几个轮子等。另外,还有几个功能:加速,减速,刹车,拐弯儿等。这些功能就是我们编程时通常所说的方法,物理量就是他们的状态描述,仅用物理量或功能都不能很好的描述他们。在现实生活中,我们把他们共有的属性和功能给出一个概念:机动车类。也就是说人们经常谈到的机动车类就是从具体的实例中抽取出共同的属性和功能形成的一个概念,而一个具体的轿车就是机动车类的一个实例,即,对象。一个对象将自己的数据和对这些数据的操作合理有效的封装在一起,例如,每辆轿车调用“加速”、“减速”就可以改变自己的“速度”显然,我们只需要控制踩油门的力度就可以控制这些操作,而不必去管汽车是如何实现加速或者减速的。

4.继承

继承体现了一种先进的编程模式。子类可以继承父类的属性和功能,即继承父类所具有的数据和对数据上的的操作,同时又可以增添子类独有的数据和在数据上的操作。举个简单的例子:“人类”自然继承了哺乳类的属性和功能,同时又增添了人类独有的属性和功能。

多态性

多态性是面向对象技术的一个重要概念。同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果,这就是多态性。多态性可以分为如下两种:一种是编译时的多态性,另一种是运行时的多态性。编译时的多态性是通过重载来实现的。系统在编译时,根据传递的参数、返回的类型等信息决定实现何种操作。运行时的多态性就是指知道系统运行时,才根据实际情况决定实现何种操作。

举例:例如,让一个人“求面积”的时候他会问你求什么的面积?圆的还是矩形的?又如,猫和狗都具有哺乳类的功能:喊叫。但是狗执行喊叫的功能产生的结果是“汪汪”而猫产生的是“喵喵”。

消息(方法)

消息就是向对象发出的请求,一个消息包括:消息名、接收对象的标志、服务标志、输入标志、回答信息等。对象通过对外提供服务在系统中发挥自己的作用。当系统中其他对象请求该对象执行某个服务时,此对象就响应这个请求已完成服务所要求的职责。当一个消息发送给某个对象时,包含要求接收对象去执行某些活动信息,接收到消息的对象经过解释,然后予以响应,这种通信机制叫做消息传递。

至此,我们对面向对象的方法已经有了初步的认识,惭愧的说,我对面向对象的概念也就认识到这一点,当然,面向对象并不仅限于此,他在不同领域还有着更多不同的内容,这只是我就编程设计所学到的面向对象理论的见识,更多的知识将在以后的学习中逐步完善。

总之,客观实体和实体之间的联系构成了现实世界的所有问题,面向对象方法的基本出发点就是通过将客观试题抽象成对象的方法,尽可能的按照人类认识世界的方法和思维方式来分析和解决问题,使人们分析、设计一个系统的方法尽可能的接近认识一个系统的方法。

上一篇: C++入门常识
下一篇: C++ 常识

继续阅读