以前,已经是很早以前了,听了一个笑话,说的是研究生面试,老师问:什么是OO,学生瞪大了眼睛摇了摇头!怎么样?很好笑吧。呵呵,虽然这笑话有点冷,但是我觉得对于一个学习计算机的人来说,这年头竟然不知道什么是OO,也确实是一个不小的笑话了吧!
后来我问了一些同学,他们很多人都告诉我说,如果说OOP,那他们是知道的,但是只是说OO,就不知所云了。借口!这是借口!知道OOP不知道OO,这种鬼话,谁会信啊?跟你说你信不?反正我是不信的。不管这么说,我们来先看看什么是OOP吧。不过话说回来,我们的学习过程总是那么滞后的,当我们还在用C写着过程化的程序的时候,见鬼的OOP就来了,然后有人告诉我们,OOP怎么好怎么好,说的好像过程化变成无用武之地一样的。但是当我们真的接受了OOP的时候,见鬼了,SOP来了,面向对象还没有真正搞明白,哪儿来的面向服务啊?简直是开玩笑么。好好好,让我们先把OOP弄弄清楚好了。
说实话,我是一个本科生,但是我发现一些研究生对OO的理解竟然还没有我这个本科生来的透彻。说起来的时候,他却告诉我,哎,都是C惹的祸啊,其实真的是这样的吗?不然吧,自己学的不好,就怪这怪那的,这也许是很多人的一个很不好的毛病吧。额,说了这么多废话,希望路过的朋友们不好觉得我的文字伤害了你的眼睛才好啊。言归正传,我来谈谈我对OO的理解吧。在最一开始的时候,我觉得所谓OO,就是数据集和函数集。当然这样的认识是错误的。只有C这样的过程化语言才会把他们称之为数据的集合和函数的集合。至少也该是数据集和函数集的封装吧?
对象,说的简单了,我们接触的每一样东西都应该是一个对象的实例。这么说吧,我们把拥有相同特性的东西,抽象了出来,就形成了所谓的类(用以描述对象的)。好的,现在问题来了,到底什么是对象呢?在学习C++的时候,老师告诉我们的就像我刚才说的一样,再加上一句,就是这样形成的类,再加上这类东西所拥有的一些相同的特性,比如都拥有某些数据,对这些数据都拥有某些处理方式等等。比如一个人,他就拥有四肢、一个脑袋、一个身体,当然有男女之分,他拥有一些自己的行为,比如吃饭,握手等。在学习例如C#、java这类语言之前,对OO的理解也就只能到这种程度了。
这张图是C++的对象模型,我没有那么厉害,这图当然是别的地方模仿来的。不管对象模型是怎么样的,重点是对面向对象的理解。到现在,我认为,对面向对象比较好的理解是这样的。什么是对象?对象是一切事物的抽象。他己的属拥有的是自性和行为。就像人一样,对象也应该有自己的行为!这样才是正确的对这个世界的直观认识。所以,在设计一个类时候,我们要做的是考虑,即将设计出来的这个类,到底哪些才是它该有的属性?就是它特有的东西。比如人有男女一样。还要考虑的是,到底当前设计的对象需要支持什么样的功能?不是你需要什么功能,这个功能就适合设计成这个类的成员函数的。看了关于C#的书之后,我觉得其实是这样的。只有”合适“的方法才能被设计成为一个类的成员函数。那什么是”合适“的方法呢?那就是这个类的行为啊,就像人应该有吃饭这个行为一样的。两次那吃饭来做例子,是不是觉得我很喜欢吃啊?其实我更喜欢谁^_^
而面向对象变成,即所谓的OOP,就是利用我们用了OO思想,设计出来的那么一些类来实现需要的功能,当然完全面向对象的编程是困难的,话是说C#、java是完全面向对象的,但是真的是那样吗?就算他们所有的操作都是用类封装起来了,但是他们内部的操作,还不是过程化的?不过这样说起来的话,好像分的又太细了。我们就暂且说他们是完全面向对象的吧。