分类: 项目管理
2006-07-02 06:54:23
这是早前的一篇帖子,Java讲到面向对象的时候一些想法,没有仔细总结,胡乱写上来的,等真放了假再好好整理下,先帖上来撑撑场面吧,见笑见笑!
Java的课程讲到面向对象了,参看钱能的《C++程序设计教程》讲到抽象和分类的概念,对面向对象的理解又进了一步。
首先,面向对象是一种思想,然后才是一种方法,套用哲学概念,先是世界观,然后是方法论。面向对象的思想也就是人们认识自然的思维规律,面向对象的方法是人们利用这种思维规律用程序解决问题的方法。
下面谈谈对人们认识世界的方法和面向对象中各种概念之间的关系的认识。
对于人们认识世界过程的哲学描述,在下实在不懂,但道理能想明白:人们认识自然的前提是将现实世界中的事务抽象成意识中的概念。比如“汽车”,眼前看到的是客观存在的汽车,但人们嘴里说的,手中写的是对它的抽象,只存在人们的意识中的概念。抽象是必须的,因为我们不能每次谈论汽车的时候都摆一台实在的汽车出来,我们谈论的更多的是意识中的“汽车”。
对客观事务的抽象,形成在头脑中或者说意识中的结果可以称之为“概念”,相应的形成在电脑中的结果就可以称为“类”。
和人们头脑中的“概念”相关的,是对这个概念的定义,比如“人”的定义,拨拉图曾经把“人”定义为“无毛的,两腿走路的动物”,好事者拿来一只拔了羽毛的公鸡问算不算人。尽管这个定义不准确,但给“概念”下定义是人们惯常的思路。前面人的定义不全面,但也包含了两个部分:无毛和走路。再比如汽车的例子,可以简单定义为“有四个轱辘,能跑的”这个定义也分成两部分:轱辘和能跑。对应在面向对象中,给“概念”下的定义,就是对“类”的定义,“类”的定义中也包含静态的成员和动态的成员。
人们在认识世界的过程中,也就是形成各种概念的过程中,还常常借助“分类”的方法。比如谈到“SUV”,你可能不知道这个概念指什么,但如果告诉你它是一种汽车,你马上就会对它有个印象,至少“有四个轱辘,能跑”,因为它既然属于“汽车”,就一定具有“汽车”的基本特征。实际上,“分类”可以说是找出不同客观事务,或者不同“概念”的区别和联系的过程,也就是找出他们的关系的一个过程。这种“概念”间的关系的基本形式是:一般到特殊。比如“汽车”和“SUV”相比,前者是一般,后者是特殊。对应在面向对象中,“分类”就相当于确定“类”之间的关系,而一般到特殊的关系就表现为“继承”。
回顾上面的过程,不难理解为什么说面向对象是用人们认识世界的方法就设计程序了。实际上,面向对象的程序设计,就是用人们习惯的思路,在计算机中表示,或者说重现现实世界的过程。一个面向对象的程序,就是现实世界在计算机中的模拟。
由此,面向对象中的其他概念就很清晰了。
比如“封装”,人们对客观事务的认识通常停留在表面阶段,事实上很多情况下这样的认识程度已经足够了,比如人类社会中,人们对人的认识通常是他的外表,就算有内心的认识,也只是通过外在表现的推断,对于人的皮肤下面的具体构造,人们不关心,一般也不必要,在人们认识自己是由细胞构成的之前,人类社会已经存在发展了几千年了。同样的道理,面向对象中人们对“类”内部的构造通常不感兴趣,也没必要知道,只要知道外在的接口就可以了。
再比如“多态”,人们通过对客观事务的分类会发现某一类事务具有某个属性或行为,但同属这个类的不同事务的这个属性的内容或者这个行为的实现过程完全不同。比如“汽车”这个类有“开动”这个方法,但某些特殊的汽车(子类)可能有不同的开动方式(具说有的汽车会采用涡轮发动机),这个特殊汽车的开动发市就“重写”了“汽车”这个父类的开动方式。
对于“抽象类”和“接口”,可以再看“汽车”的例子,人们通常讨论这个概念,只要知道它能“开动”就行了,而具体开动的实现方法不比关心,但是又必须知道它能做哪些事,这就是“抽象方法”。