发信人: hunter__fox(雁回西楼)
整理人: hunter__fox(2002-05-21 10:04:43), 站内信件
|
一直以来,我们都在谈论对向对象编程,那么,什么是面向对象编程呢?
以下是我对对向对象编程的理解和一些体会,说来与大家交流一下。这些东
西,是以VFP6为出发点来说的,而不是VC或VB等,因此,不一定具有通用性。
提到对象这一概念,首行应该说一说什么是对象,和 Windows系统的一些特
性的实现方式。
对象,在各种开发工具里,基本上是定义为:属性、方法、事件的集合。虽
然有的地方的定义讲的很复杂,但说来说去,也都是这么一回事。也许有此对象
没有属性,或者没有方法或者事件,但一个对象一定不会是只有一个元素,这是
我的看法(虽然,从理论上,这种对象是可能存在的,但我看不出它们会有什么
用处)。
Windows系统是一个图形界面,这是共知的,而 Windows中,最大的特点,
对于编程人员来说,并不是图形系统,而是它的对象系统。在 Windows中使用对
象是有必要的。试想,这么一个大的系统,尤其是微软这样的公司来开发,如果
没能够用一种方法来使各部份尽可能的独立,那么,将会是什么样子?对象化,
将一系列相关的功能和数据集中到了一起,开发人员将不再为得到各种数据而费
脑筋,他们可以将更多的精力集中在开发目标上,而不是系统平台上。
对象化,当然关不是从 Windows开始的东西,但真正显得有必要使用这一方
式,我个人认为,是从 Windows系统开始的。看一看 Windows API,那里面很多
地方使用了句柄,句柄是什么呢?我想,我们可以这样简单的去理解它(虽然不
是完全正确的,但对于理解对象和句柄却很有用):句柄就是放一个内存中的号
码,就象一个表中的主索引"ID"一样,它是唯一的。
即然已经这样做了比喻,那就来得完整一点:这个表还有一个字段,是备注
形态的,这就是对象了。在 Windows系统中,它也不叫对象,而叫"资源"。资源
就是对象,在最开始,我们可以这样简单的去理解。象窗口,对话框,鼠票标指
针,都是资源,资源是用对象的形式来进行管理的,好比这个备注字段,它可以
是一段字符串,也可以是一个图片文件的内容,也可以是一段声音,甚至可能是
一段经过编译的可执行代码,它们都是放在这个字段里。
那么,我们怎么确定它是什么类型的内容呢?很简单的,我们会它加一个字
段,用来表示它的内容形态,这个字段,就相当于对象的 Class属性。
如此种种,对象,就是这样子出现了。
那么,我们怎么样来理解"面向对象编程"呢?
并不是简单的使用各种类来建立表单。那不是面向对象,只不过是基于对象
而已。
要区分面向对象与基于对象,又得做一个比喻。这次,用一个各处都用过的
比喻:盖房子。
盖房子要用砖和瓦,还得用水泥和其它各种材料。
一个程序就好比一栋房子,程序的各部分,就好比各种材料。我们的程序就
是用各种原材料一点点堆砌起来的。
在这个过程中,我们可以有这样两种方法:
一、先用各种材料做成一种一种的预制构件,小到一个水龙头,大到一个移
动式的小房子,然后再一个一个拼装起来。好在编程不完全像盖房子,我们做一
个水龙头后,哈哈。。。就象魔法一样,它能够一变十,十变百,百变千千万,
我们可以随便用多少次,而不必再做第二个水龙头(当然,如果你只用一种水龙
头的话)。
二、先将要做的各种东西列出一个表来,看看哪些东西不必做,我们可以在
商店里去购买。然后,对那些没有地方卖的东东,我们就自己做,一连盖房子,
一连做我们要用的东西,东西做出来时,就成为了房子的部分。
可以看出,这两种方法各有各的好处。第一种方法,我们如果要盖的是一个
很大的房子,而里而有很多东西是相同的,那么,它很好用。但是,如果是一个
个人的住房,那么,我看,还是选用第二种方式的好,因为我们不必为所有的东
西都做一个模子出来。。。能省事就省事吧,呵呵。
第一种方法,就是基于对象;第二种方法,就是面向对象。当然,这个比喻
并不是很恰当。
基于对象,象VB,这是一个典型的基于对象的开发平台,在它那里,所有的
东东都是对象,连事件,也是当做对像来对待的,这一点,看看调试环境就很明
白了,因此,连变量也是对象。
面向对象,典型代表是VC。我们还是用VFP 来说吧,虽然它还没有完全的对
象化。VFP 中,我们常常定义自己的Form,象这样:
Define Class _frmMyForm As Form
...
EndDefine
即使,我们不去定义Form,我们做的表单,也是这样做的,编译的代码,就
是这样将我们的表单定义的,执行时,VFP 运行环境就是这样解释我们的表单文
件的。
我们使用的不是现成的对象,不是现成的类。设计时,每一个表单只是一个
类而已,运行时,每一个表单就是一个对象。关于类怎么变成对象,这里就不讨
论了。
那么,我们该怎样对待"面向对象编程"这一概念呢?
很多朋友问的问题中,是关于菜单的。
菜单,是VFP 中没有对象化的东西(据说VFP7已经对象化了,但我没用VFP7,
因此,还是按VFP6来发表我的观点)。很让人难受的语句----可以说是难以控制
的一些命令,常常出现一些问题。一个很显然的问题:怎么在菜单中加入图片(
或者icon)?我们只能摇头,因为VFP命令里没有这个功能。
其实,我们不必这样沮丧的。"只有你没想到的,没有VB做不到的。" VB6.0
发布时,微软这样声称。我们也可以套用这句话。没有做不到的。创造。创造才
是最可贵的。不要只是依靠现有的东西。VFP 没有给我们的,我们是可以自己做
的!
一个对象化的菜单是不是很难做呢?
确实,它不是很好做的,很多东西互相关联,菜单,应该是一个程序中最敏
感的东西。鼠标移动,按下,组合键的使用,快速键的使用,激活、展开、事件
和外观的控制,太多了。
但是,我要说的是,我们能做到的。真的。
VFP 中,我们能使用Windows API 来完成很多VFP 不提供的功能,菜单的各
种事件,用事件能完成一部分,再用Windows API 完成另一部分,对象化菜单并
不是一个很不可思议的东西。如果不考虑与非对象化的菜单合并使用,很多问题
就是很简单的事情。我在去年就已经完成了这样的工作。它意味着,如果我的程
序完全使用这种对象化菜单,那么,它能让我做更多的事----有些事,是VB的菜
单也不能做到的。出于公司的制度,我不能将它弄上来,但我说这些,是要说明
另一个问题:没有什么是做不到的。
报表,是VFP 中另一个不足的地方。同样,我们也可以对它进行各种调整。
很多朋友已经开始使用态报表了,这就是一个面向对象编程的例子。
当然面象对向编程不仅仅是我们做出各种类,各种平台不提供的功能。不是
的,至少,不仅仅是这样的。
它是一个观念。即:我们编写的,是类,当类运行时,就是对象。通过对不
变化的类进行各种处理,确保对名象在运行时按我们的需要来"动起来"。
面向对象,我们不仅仅要考虑功能用什么语句实现,我们还应该考虑其它的
问题:资源、时间、执行序、事件堆栈等等。
这也是这什么不是"面向类"而是"面向对象"的理由。
因为一个类,我们可以建立多个它的实体。如同VB中的控件数组一样。遗憾
的是VFP 中没有提供静态变量供我们使用,否则,我们就有可能建立横跨多个表
单的对象数组了。(幸好没有静态变量使用,否则,VFP6可能早就是一片混乱的
世界了)
有个朋友问过,VFP 中怎么建立新线程。我想,这个问题是不需我们来回答
的。当你不能理解线程是什么时,你是不应当使用任何方法来建立新线程,因为
你不了解它,你不能很好的控制它。当你确实需要使用新线程(或者新进程)的
话,你就应该先去了解什么是线程,什么是进程。当你了解它们时,你就已经知
道如何建立它们了。它们是一种可以称为"危险"的东西。在Windows 环境下,还
没有哪一个开发平台将它对象化。
而面向对象,我们一般情况下是不需要了解它的。
前一段时间,zhenbao (珍宝)曾为一个问题苦恼:查询时,其它代码并不
执行,因此他的进度条总的不动。当时我的回答就是,建立一个新线程的话,就
能解决。具体怎么建立,我没说。我甚至连在哪里去找相关的信息也没说。为什
么?
因为对于他来说,不再是对VFP 了解不够了,而是需要对整个Windows 进一
步了解的时候了。那不是看一个具体的帮助文件或者资烊即可的,需要一点一点
的去积累,没有一躇而就。很多朋友学编程学到一定的程度就很难再进一步,原
因也就是因为缺少了平时相关方相的积累。
对其它开发平台,对操作系统,对各种编程思想的学习与吸收,对于现在使
用的开发平台,看来没多少用处,但却是越当你深入时越重要的知识。
面向对象,不是VFP的事,因为你使用VFP,就已经是面向对象编程了。但怎
么样才能发挥面向对象的长处,那就需要我们了解更多看来与VFP 并无什么关系
的东西,如,Windows 操作系统,如,VC,如,开发方式的发展历程。等等。
就象读书。专科,本科,都不需要你掌握很多东西,你只需要对你必需用的
东西了解即可。但读博士就得学很多的东西,即使你是天文学的,也得去记住贝
多芬是哪一年死的。
这些东西,不一定是你立即能用到的,但在你进一步提高自己时,即是很有
用处的。因为要了解的东西多,所以,我们应当在平时就多注意去接受这些方面
的知识,而不是等到要用时,才急急忙忙的去学----事实上,我们也不可能有这
样的时间去学这些。
因此,面向对象编程,是一个平时积累的过程。
---- 作者:hunter__fox【雁回西楼】
※ 来源: 网易虚拟社区 广州站.
※ 个人天地 流水情怀[ccbyy] 灌水精英 NO:003
※ 编程开发 VFP[VFP] |
|