千言万语直击对象本质
《对象之所以成为对象》---就程序设计领域的面向对象编程的对象一词做深度解析
什么是对象?对象是变量和方法的结合体,它就类似于我们现实生活中的事物。
什么是类?类是具有相同属性和方法的集合,是对象的抽象。
这是教科书上常用的描述方法。但我认为这种描述其实是最不负责任的。这种话谁都会说。我们所以看到的书都是这么说,大概也是缘于中国的一大特色--互相抄袭的缘故。他们中的大多数作者并不理解其中的概念,人云而亦云。--只要懂字便可以出书,这便是中国的特色。
对于文字描述的事物(所谓的概念)和现实事物之间的理解,人脑要把它们联系起来,主观上并不容易,因为客观上它们之间是存在脱钩情况的。用计算机代码描述的对象(比如杯子)和现实存在的对象本身几乎可以说风马牛不相干。比特和原子本来就是不可联系的东西。要让我们再把由它们叠加起来的更为复杂的东西联系起来,不仅需要事先对计算机环境有所熟悉,更需要一定的想象力,通俗来说就是要让学生们明白为什么一段由所谓变量和函数组成的计算机代码就可以称为是杯子的,以便于跟现实的杯子这个活生生的东西勾结起来,虽然中间还需要想象,但这种想象已变成常人都能完成的思考能力了,我认为这就是理解对象概念的第一初始要素,也就是第一要给予关注的关键点。
我在看来,要把比特物和原子物这两个本不相干的东西联系起来,唯一方法就是比较,通过对比把她们硬勾结起来。如果有人试图通过演绎或归纳的推理方式来把她们联系起来,那是比较幽默的。
如何比较?指导思想其实很简单,就是让学生们明白一段代码怎么看起来就是现实中的杯子或是任何一件想表达的现实中存在的东西,比如一个美女。目的就是让学生们看到代码就同看到事物,即见码如见物。
如何达到以上目的,这需要从一个最初始的问题开始,就是回答什么是程序和程序的功能是什么?
简单说程序就是代码块,具体点就是由数据码和指令码组成的代码模块。这里需要突出的是数据和指令是组成程序的两个基本要素,缺一不可。注意:单独的数据或是单独的函数是不能工作的。并且一个程序除了数据就是指令,除了指令就是数据,再没有所谓的第三种要素。
程序有什么功能?我们的回答是由一定量的数据码(变量)和指令码(方法或函数)组成的程序,只要给予适当的设计,理论上均可以给出任何我们需要表达的东西,这些东西的表现形式可以是屏幕模式也可以是内在的存储模式(我们想从程序得到的无非也就是这些形式的东西),它们可以是一个返回值,或是一个显示在屏幕上的东西,如文字、按钮、窗口、杯子、动画、美女等。并且由于包含了可以互为操作的变量和函数,所有这些程序都可以设计成具有响应用户操作动作(即所谓事件)的能力,如响应键盘和鼠标输入并给出相应的结果等,具体例子有命令按钮、对话框、滚动条、窗口拖动和放大缩小等。所以我们在vb里随便拉出一个控件便可以对它添加进入具有响应任意动作的功能模块就是这个道理。问题的实质是,一段包含变量和函数的代码模块里,我们把它设计成什么样的功能不可以呢?除非你想不到或是不愿意那么做。这就是我们所谓的类体或对象体(或有曰之控件、组件、部件,本质不过是一段小程序)里都可以具有所谓属性、方法和事件的原因。因为别忘了,它们是程序。
话说到此大家可能已有所明白,实际是只要我们把编程模块也包含进一定量的数据和函数,也就具有了程序的特性,因此也自然的便有了表达任何事物的能力了,比如画杯子、窗口、美女和响应用户输入动作的对话框及勾画出一个播放器等等,也就是它实际就是一个名副其实的程序了,只是看我们想把它做成一个大程序模块还是小程序模块而已。
问题的要害就在于此,目前我们所谓的面向对象的编程模式实际就是基于这样的思想开发出来的,就是把编程模块都做成包含数据和函数的小程序,这些小程序在语言中我们通常用类模块来表达。而既然类就是实际意义上的小程序,那么回答对象概念就变成一件简单的事情了。→因为类是一段小程序,因此其生成的所谓对象也是一段小程序;既然对象是一段小程序,那么它便可在内存模式或屏幕模式上表达出任何我们想要的东西,如一个桌子、一辆轿车、一个人、一匹马、一个小按钮、一段文字、一部电脑、一个美女、一幅动画、一门大炮、一堆土、一堆粪便、一只蚂蚁、一件衣服等等等等,并且所有这些东西都具有响应用户操作事件,除非你不设计进去。而只要你看到这些,你敢说它不是一种我们现实生活中的东西吗?敢说它不是我们现实生活中的对象体吗?
至此,我们实际已明白地回答了上面提出的“如何比较?”即如何把比特物和原子物联系起来这一问题了。本来由代码和数据组成的程序模块(比特物)跟现实生活中的物品(原子物)是不相干的,但当我们把由代码和数据组成的程序模块时刻看作一不可分割的程序体时事情就不同了(面向对象语言就是刻意这么做,它们一般都由class语句来加以界定),因为按照程序功能的观点,这个程序体是可表达任何我们想表达的现实中存在的物品或事物的,所不同的是这个物品是画在屏幕上或表达在内存里,但从影象学的观点看,一个按照现实模型描画在屏幕上的物品(如杯子)应该不会影响我们把它当作现实中的杯子来看待,除非你是一个影象虚无主义者。
最后我们要说的是:此文在回答“对象”这一概念时同样用了“函数和数据相结合”这种方法,但由于我们从程序观点这一更基础的知识层面去分析这种方法,所以我们在理解“对象”概念上就更显得有依据 ,就更容易从通俗的视角来把握“对象”概念了。
附:类这东西无论在源程序还是二进制目标程序都随程序一起,属于程序的一个重要组成部分,多数对象倒是需要时即时由类生成的。个人感觉这倒是理解类的最根本要害所在。
作品来源:http://hi.baidu.com/javami/blog/item/cf88df1b3d87f7d4ac6e756f.html --------------------编程问答-------------------- 为了祖国技术的明天,自己顶一下!,真没办法呀 ,这个国度!:) --------------------编程问答-------------------- 从回帖就知道C#大概没希望了!!! --------------------编程问答-------------------- 事实是"类"不过是在原始的基本数据类型基础上稍做改动的技术,即将原来数据和函数分离的状况改为不分离.方法也很简单,不过在语言里加了一些诸如class的界定语句即可,从这可看出从原始数据类型到类的数据类型技术上只做了一点改动,所以也看出面向对象技术重要的不是它的技术,而是它的思想.从这也可看出,真正有威力的易做图不一定需要惊天动地的技术改造,一顶点灿烂的思想同样可引发一场伟大的技术变革.
点睛评论:主要是思想,而不是技术.
补充:.NET技术 , C#