转眼间,在编程道路上的行走已经快一年了,心里突然觉得有许多话想拿出来与大家分享一下.我觉得我的路走得很不一般,首先我是学无线电出身的.与编程有点接触,但并不是看家本领.好闲话少述,我们进入正题吧,不然斑竹要删帖了,我的话题是属于C++,希望我没走错屋子作为我在这个坛子里的第一帖,我想谈谈我对组件的一些看法.
??简而言之,组件就是对象。C++中没有组件的概念,但它可以做出各种各样的组件,C++是一门语言,而组件是一个编程模型,Delphi中叫部件,而在Visual BASIC中叫控件。
??组件是对数据和方法的简单封装,C++能够实现组件就因为C++ 对象模型具备这样的能力。组件可以有自己的属性和方法。属性是组件的数据存贮单位。方法则是组件的一些简单而可见的功能。
??为了说明白话题,我来具个例子,我想开发一个工程,这个工程的功能是简单得不能再简单的计算.设这个实现1+1=2的组件的方法为int Add(int var1=1, int var2=1),实现了这个组件后,我把这个组件买过来,进行二次开发.也就是说我的应用程序用了这个组件,但我在用的过程中我得到的并不是原码,只是二进制的可执行码,和相关的头文件(.H什么的…),还有库文件(.lib什么的),最后一个是.dll文件.我在应用中用的只是Add这个方法,它的实现我不知道,但它行为的结果,我可以接受,因为我要它算1+1=?时,它不会告诉我等于11.但是总于有那么一天(或者真有)1+1不等于2了,我就要向卖给我这个组件的开发商说:”我说朋友呀,你最初卖给我的东西,过时了,现在都何年代了,怎么1+1从你的产品出来的还是等于2呢?我现在呀,没时间再改我原先的应用了,你得负责,你得让我原来的应用得出1来呀,不然我以后不再与你合作了”,这时开发商就回去改变了它原先的组件,然后把它交给我,我当然不会再为我原先的应用重新编译拉,链接拉什么的…我只是把它给我的.dll覆盖掉老到掉牙的那分.dll.然后我执行我的老应用程序,奇迹出现了,1+1真的不是2了,而是1或作别的什么的.
这就是组件的一般用法,不过它感人的地方远远不只这些呀.接下来我要来点术语了和细节了.
首先提个问题(看来我的问题挺多的,呵呵)
为什么COM (Common Component Objce)只能提供接口(Interface接口是一个包含方法入口地址的表格,但更确切的说,它就是一个指向表格的指针变量的一个地址,是不是不好理解)给用户访问对像,而不能直接访问Object的数据成员呢?
这个问题的答案是: 这并不是绝对不可以直接访问Object的数据成员,要访问得有条件:
1 客户端的应用程序必须由支持指针的语言来开,例如C++, 但VB不可以.
2 一旦一个组年已经生成,也就是编译,链接成.dll文件后,就不能再改变组件的数据成员了(例如,给对像加一个变量,删除一个等),甚至把数据员声明顺序也不能改变,但接口可以扩充,记住原来的接口也不可以改变的,但可以扩充.(因为扩充接口,和改变接口的实现,是COM较为讨人喜欢的地方之一)
要我接受这么苛刻的要求,就相当于,1+1永远等于2了,不能再改变了,也就是,开发商不会再为我提供更新的服务了.如果要,的话,你得重新编译链接,那么我还开发什么组件呀,开发商直接给我源码得了呗.这样看来我们最还是不要直接访问组件对像的数据成员好了.这也是COM最基本特性之一.
为什么会这样呢?
这又得从COM所采用的对象模型谈起(真累呀!).不知道是巧合还是微软有意思将COM模型建立在C++对象模型的基础之上.也就是说现在我们的重点是放在C++对象模型上了.众所周知C++对象模型的特点是:
1 空间和存取时间的效率较好(最起码要比CORBA和SOM所采取的对像模型要好)
2 灵活性及弹性确不够理想,例如,不能直接访问对象的数据成员就表明弹性不足(但CORBA 和SOM确可以)
通常情况下,效率和弹性是一对死对头,两者都很Radical(极端).如果你要效率,那么你会去相应的弹性,反之亦然.就好像VB比较可人,但运行起来要比C++大哥慢许多一样.但它们谁也不指望谁要消失.因为,各有各的长处就是了.
至于,C++对像模型(COM采用),表格驱动对像模型(CORBA和SOM采用)我想下次再说吧,我为我的帖子写了我前提到的组件(实现Add), 但不知道为什么原因总传不上来,如果谁有兴趣就跟贴吧,大家多顶几下,想必这是我的第一贴,呵呵
[原创]简单谈谈组件及COM---我的第一帖