我所理解的面向对象概念技术

来源:互联网 发布:莎莎源码vip展会号 编辑:程序博客网 时间:2024/05/16 05:49
* 所谓面向对象,就是把现实世界的所有物体对象化,可以是一个人,一座房子,一匹马等等.
  * 而我个人认为面向对象,首先要把面向与对象分开,在我们明确了对象之后,才可以考虑如何去面对它,而面对他并不是指你的脸面对向他,而是指我们如何去挖掘这个对象的实际的内涵。比如我们把一个人确定为对象,那么我们就应该考虑这个人具有什么样的外表特征,也就是我们所说的一个对象的属性,具体对人来说,是指他的身高、体重、姓名、年龄等等,往往指那些静态的特征。
  * 我们还应该考虑这个对象在特定的环境下会有什么样的反应,或者是这个对象本身有什么样的行为,即我们所说的方法(函数);具体对一个人来说,指人的吃,喝,走,笑,遇到惊吓所表现出来的哭等等,往往指那些动态的行为.
  * 而我们把那些具有相同的属性和行为的对象分为一个一个不同的集合,我们把那些不同的集合换个说法,称之为不同的类,类其实就是一个高度的抽象与概括.
  * 而大千世界,从远古到今天,事物都是在不断的发展、不断的进化、或者是不断的退化。举例来说:在古代,我们的祖先猿类经历了数万年的进化而演变为今天的人类,也就是说人类是有猿类进化而来,等同于说人类继承自猿类,经过时间的冲洗而发展的起来的,那么我们要问:猿类与人类的区别是什么? 也就是说,怎样才能区分他们两者。答案是:通过他们两者之间的不同的特征、生活方式、动作行为加以区分归类的.
  * 而我们给不同的类定义其特有的属性、行为的过程,就被称为封装。封装的主要思想就是把一些特有的属性与方法赋予一个具有相同特征与行为的类的过程。
  * 更加仔细的人会发现,显示世界中的每一个物体都不是完全一样的,比如不同的人(即我们所说的对象)有不同的笑容,或者不同的走路姿势,这样的现象概括起来就是:同样的事情(方法)对于不同的物体(对象)有着不同的表现或处理方式,我们称这样的现象为面向对象的多态.
  * 多态的主要思想就是:同样的一件事情,有着不同的处理方式(动态多态)或者表现形式(静态多态).
  * 基于现实世界的事物表现原理,而构架自己的运行机制的一种技术成为面向对象的技术,也就是说一种技术它是以面向的对象为设计理念的.而.net就是面向对象技术的一种最优秀的技术。
  * 具体表现为: .net中的所有的变量、属性、方法都应该放到类里面;一切皆为类,而有类创造对象,对象调用具有相同属性和共同行为的对象的集合.
  * 对象就是类的具体表现形式。
  * 封装对于一个类内部的结构而言,什么样的方法可以被调用,什么样的变量可以被访问.
  * 继承对于两个有着某些牵连的类而言的,一个是另一个的扩充,或者是细化.
  * 多态对于不同的类或是同一个类的不同对象而言的。同样的方法对于不同的类有不同的实现(override);同样的方法对于同样的类有不同的版本(overload)。

  面向对象技术并非是一个新技术,它已经诞生了接近50年了。这种编程思想诞生的时候,正是所谓的软件危机出现的时候。它从危机中诞生,只是为了搭救那些被自己的思想和自己编织的错误所禁锢的痛苦的程序员们。面向对象的思想用一种崭新的思路来描述了程序空间——这种由各级程序员所编织的不知道是多少维的空间,似乎让当时的人们获得了拯救似乎让所有的人看到了软件行业中的天堂。可是几十年过来了,问题仍然存在。复杂程度仍然在不断的提高;真正成功的项目依然是那么的寥寥无几。《没有银弹》中声称和断定,在近十年内,没有任何单独的软件工程进展可以使软件生产率有数量级的提高。这篇文章从发表到现在已经将近20年了,我们的问题依然存在。


  做了几年的软件。慢慢的从当初的热血沸腾中冷却下来,才发现面向对象技术并不像当初所想象的那么简单。做一个好的面向对象的程序是很难的,一个好的结构是难得的。如果想用简单的几个小时就把面向对象技术解释清楚,那也只是一种徒劳的工作。因为它本身就不那么简单。就像我们所面对的现实世界一样,现实有多复杂那么面向对象技术就有多复杂,现实有多简单面向对象技术就有多简单。它和我们息息相关的世界是紧密联系在一起的。它是依赖于人本身对这个世界的看法的不同用不同的样式展现在我们这些对世界还不怎么了解的人面前的。

现在很多的初级的软件项目团队最容易出现的问题就是,在对面向对象编程思想的理解上的误解和错误的应用上。很多人(包括我)曾经打着面向对象的旗帜大肆的应用面向过程中的思路。当然我并不是在这里说面向过程不好,只是感觉这种解决问题的方式过于对自己不负责任了。就像一个古代的人来到了现代,就算是他穿上了现代人的衣服也总归是古代人,总会惹出很多笑话和令现代人感到不可思议的事情。

  上面的这些话过于偏激也有点偏离了主题。下面我们从上面的文字中跳出来,来看看我所理解的面向对象,是否也是在一种错误中不断的循环。

  

  面向对象,顾名思义是一个由各种各样的对象组成的世界。它是一种思想,是一种考虑问题的方式。它最终的目的是用一种类似于现实中的对象来模拟出我们要解决的问题的一种思想。

  现实中的对象有什么特点呢?概括起来可以说现实中的对象都有自己的特征,而且这些对象都有一些相关的行为。例如:现实中的小狗,它有一些自己的特征如毛色、大小、尾巴的长短等等(可以根据我们所知道的罗列出很多);它还有它的行为,比如见到陌生人它会叫。见到主人它会摇尾巴等等。现实中的所有东西都能总结出类似的东西。面向对象思想就是利用现实中的这些对象的这种特点抽象出了一种特殊的数据结构。这种结构也有自己的特征(属性)和自己的行为(方法)。利用这种思路来模拟现实。达到合理的安排程序的流程的作用。

  这就是一个对象的基本特性。当然一个系统中不可能只有一个对象,一个完善的软件系统中将会有成千上万个对象一起工作才能完成某项特殊的任务。这些对象当中有很多都是类似的,有着近似的行为也有着近似的特征,我们就将这些对象归为一类。就像现实中我们也对很多有相同特点的对象进行归类一样。面向对象中就是用类来描述一个对象的,这样我们就不会被埋没在数目众多的对象中。因此类就变成了面向对象中最小的描述单元,所有的对象对归为某一类的对象。

  面向对象还有几个重要的特征是必须记住的,那就是:封装、继承、多态。其实这三个重要的特性也是从现实世界中抽象出来的。下面一一进行解释:

l         封装

还是顾名思义,封装就是将一些保密的东西密封起来,让外界不可见。现实中到处可以看到这种事情。比如:你到邮局去发一封信,你完全不必要知道你的信是如何发到收信人那里的。你只需要知道如何才能发信就可以了,邮局内部会处理这些信的。因为邮局没有必要告诉你他们工作的详细细节,你也没这个必要去知道。为了更明显的理解封装的不可见性。我们用一个人做例子,说的是人的消化系统。从人的外部来看根本看不到有这么一个系统,唯一能看到的事情是,从人嘴里吃进去的东西,经过很久很久之后从另外一处地势比较低的地方出来了一种经过处理的物体。这就是人对外部公开的可见的部分。可是内部怎么将食品处理成垃圾的就不得而知了。这就是封装。这样带来的直接的好处是从外部看,大家都只需要知道一些公开的东西就可以了,不需要知道全部,达到一个安全的状态。想象一下如果你能看到和操作到人的消化系统,那么将会是一个多么可怕的事情啊!另外一个人将会多么的尴尬和恐惧你啊!所以封装是非常重要的面向对象特点之一。

当然,上面所介绍的只是解释什么是封装。封装还有其他好处,那就是如果一个系统的封装特性考虑的够好的话那么就会是整个结构非常稳定和健壮,不好因为修改了一个地方而不知怎么就改变了另外的地方。

虽然封装的特性是这么的好,但是我们经常忽视它,在一些初级的程序员的代码中经常看不到封装的特性。经常是所有的声明都是public(公共的)的,而且对应该是protected(保护的) 也变成public的。

l         继承

继承可能是我们在面向对象思想中最容易接受的一种特点,因为我们在现实中经常听到这个词,而且在面向对象思想中的继承也类似于现实中的继承。但是继承又是我们在应用面向对象解决问题的时候最难用的一种特性。而且大多数的面向对象的初学者,在他们的程序中很难看到继承自己设计的类继承了自己的类。这里我也不是说所有的问题都要通过实现一个继承来解决。而是在合适的地方合理的运用。比如,在一个有关样品的管理中,样品有很多种像鞋样品、包样品等等各种各样的样品,在这里我们就部能单纯的用一个类——样品类来表示这么多种样品了。我们就要将他们再详细的划分为更加细的类别,将他们所共有的属性和行为放入基类,将一些本身特有的属性和行为放入派生类种。例如下图。

例如下图。

图一

派生类能够继承基类所有被授权的属性和行为。所有派生来都属于基类。如果用这种方式来实现我们软件的结构。那么我们就可以统一管理这些类别,而且如果将来出现了新的样品类别比如帽子类样品,那么就务须修改前面已有的鞋类和包类,只需要从样品类种派生出一个新的类帽子类就可以了。如下图:

图2

而且这种思考问题和解决问题的方式也是必要的,因为现实中也到处存在这这种关系,用这种模型可以充分的模拟出现实需要解决的问题的模型。

 

l         多态

多态也是一种现实中存在而且经常用到的特性,不过我们平常不怎么注意罢了。例如,早上你和朋友见面,朋友问你吃饭了没有。其实这个问题就是一种多态。也就是同样一个事物在不同的环境下的具有不同的状态。我们可能根本没法理解,但是仔细一想就会明白。这个朋友问的这个问题是你吃了饭没有,那么它根本没问你吃的是哪一顿饭。但是你已经理解了他到底是问的是哪一顿饭,因为现在是早上,他不可能问的是昨天的晚饭或者是今天的午饭。这就是这句话的多态。在现实中尤其是在各种语言中有很多这种多态的现象。在面向对象程序中的多态大多是表示一个方法具有很多种状态。比如,我们可能会看到一个方法start()又可能在同一个类中看到另外一个方法start(int i)这里就是同一个方法具有的不同状态的一种。还有的是派生类里面重写了基类的相同的方法。根据对象的实际类别这个方法也会有不同的状态。在这里就不多解释了。

 

上面介绍的这些是面向对象编程思想的一些基本的特性,当然还有其他的特性,而且这些特性都是根据客观世界中的实际对象所总结出来的。也就是说在客观世界中大部分可描述的特性都可以在面向对象思想中用一种特定的方式表现出来。最关键的一个思想就是用现实的模型来制作软件的模型,用现实的描述来描述一个软件对象。这样我们就会对问题有比较深刻的认识,而且解决问题的方案也会将对健壮,因为现实中的所有事物都是经过长时间的考验才存流下来的。


原创粉丝点击