对象幻想记

来源:互联网 发布:天龙八部装备评分算法 编辑:程序博客网 时间:2024/05/02 00:21

[ 对象幻想记 ]

---声明: 以下内容为笔者胡思乱想的, 并不想伤害任何人的信仰, 如果对阅读文章的您产生了不良影响,

或者让您感觉到愤怒, 请多多包涵.

 

    对象是什么?这个世界又是什么?恐怕我们无法回答。但在虚拟的世界里,对象就是:
一团具有强关系的属性值加上操作这团值的代码的实例。

  C++ 和  Java 中的对象:
    --对象是类的实例。类实现了相关数据与算法的封装。类由设计人员根据设计对象抽象而成。
类也是对象实例化的“模板”。

    现代计算机仍然是以指令操作数据的方式来工作的,对于计算机来说,整个程序就是一串行的
指令流。图灵机就说明了计算机的根本原理。计算机只知道根据指令进行四则运算和将数据移动,
从总线上输出数据,输入数据。

    让我们再高级一层,应用程序要解决的是什么呢?就是对数据的处理(在很多科幻小说中,计算机
也叫数据处理机)。无论是在屏幕上画画,还是输出声音,都是对数据的处理。应用程序就像是一个
根据规则进行数据处理的有序指令集。

    事实上,C++或Java中的类也是在描述着一团数据和对它如何处理的规则。人们将类的功能强化了,
认为类应该有像动物一样的支持“下一代”的能力--继承。
    这个能力有好有坏,好处就是,许多OOP书籍借着生物的继承特性描述了这种能力的强大--每当
要在原有类上添加新功能时,用继承就可以很好的解决问题,而且不用修改原来的类。
    然尔坏处呢?第一次,二次修改没有什么问题,但当维护者进行除错时,发现要回溯到N个类,就像
要医好孩子的病就得要检查父亲,爷爷,祖宗的详细身体。这一点就让后来的维护者感到愤怒和无奈。
于是,人们又提出了继承最好的设计不超过三层。
    一个问题似乎解决了,然尔,这样一来,第二子类,第三个子类也许就得经常修改以适应不断变代
的要求和后来发现的问题----随便说一句,这和直接修改原始类的代码有什么区别呢。

    继承能力更大的缺陷却在于,允许不同的类继承--相当于,相当于允许桌子和鸡进行杂交。Java修正
了这一观点,只允许单继承。桌子改进的下一代也应该是桌子。而且Java将多项功能组合的能力给予了新
的对象--接口。Java说:接口就是描述共同能力(方法)的高度抽象类。接口没有具体方法,它只是给这
些能力起个名字。如果你要用它,就得将它绑定到支持它的对象实例上去。结果Java中的类还支持另一个
特性--接口,如果这个类想支持多态性,可以通过支持多个接口来实现。

    C++一看,说:这个接口不就是抽象类么?于是,C++也通过自己的抽象类摸拟了接口能力。

    然尔对于现在的学习者来说,抽象类和接口通常是难以区分的。或者说,根本无法区分!人们看待问题
的方面不一样,从而经常有认为该使用接口的人和认为该使用抽像类的人争论。

    多态性。这个也是面对对象/面向对象编程中经常看到的。什么叫多态呢?就是这样的行为:一个人,他
会修电脑,修电视,修空调。而找他的人在打电话中只说:我家东西坏了,快来修!于是,这个人,到了客
户家里,如果客户坏的是电脑,就修电脑,坏的是电视就修电视。在这里,客户只说了修东西。至于具体修
什么,这个人到了现场就自动处理。

    如果拿画图的程序来说,有一个基类,它有个方法--画图。有三个子类,在继承的时候,“重写”了画图
方法。画三角的“重写”画图方法为画三角的代码,而画矩形的则实现了画矩形的代码,画圆的则实现了画圆。
然尔对于画图的程序来说,它只通过将三个子类看成基类,然后通过调用“画图”这个方法就可以调用三个子
类的画图方法。实现这种方法有重载,或者将基类实现为抽象类等方法来实现。

    而对于Java来说,多态性就是接口的使用方法之一。

    OOP 的东西非常多,成为专家的人除非是浸淫了N 多年,否则很难完全理解OOP 的精华。然尔,正是由于
OOP 本身的灵活,使得每个人都有自己的一套对象模型。

    总的来说,OOP 思想非常不错,但由于强大的灵活性,让实现的人有很大的不同。C++和Java中的类其实都
是数据抽象和操作数据的算法/规则集成。继承 -- 可以理解为对数据集合,算法的扩充。接口 -- 可以
理解为编译器自动译名的通用算法的名字统一。
   
    又回到论题上来,对象到底是什么?我们看待对象的根本性质在哪里?也许没有答案。个人认为对象只是一
团用于描述对象表征的数据而已。就像 苹果 由 外形,大小,味道,以及脆口程度等表征属性组成。苹果也许
有自由落体这个修改其自身位置的行为,然尔,梨子,葡萄也有自由落体这个行为。如果说自然这个大计算机
拥有修改自由落体能力的法则,那么,这个法则作用到不同的对象上,会有不同的效果。这就是多态性,然尔,
实际上,这个法则也有三种不同的版本,一是苹果自由落体版本,二是梨子的,三是葡萄的。对于计算机来说,
就是三段代码在操作三团数据集。说得更普通一点,最终还是等同于不同的代码操作不同的数据集。

    所以个人认为,不管用什么语言来实现面向对象的编程,关键不在于语言,任何语言都可以有自己的一套
面向对象编程。我们所做的OOP高层次的抽象,只不过是自己在欺骗自己而已。