简单谈谈组件及COM---对象模型图

2008-02-23 05:35:29来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

我发现没有一张图,是说明不了问题,但是贴子,放不了图片,没办法先,上传一张吧.

在第一贴,我们最后谈到对象模型,我现在谈谈这方面的问题。
就我所知的对像模型有三种:简单对像模型,表格驱动对象模型,和C 对像模型。
但是在真正用于产品的也但是是后两种,我不知道第一种有没有真正被应用(读者假如知道请告诉我一声),表格驱动对象模型被CORBA(common object request broker architecture)和SOM (system object model) 采用,而C 对象模型被COM所采用。
先看看表格驱动对象模型:
图中的表格驱动模型对象中,左边的就是个对象了,本对象由两部组成(其实不只这些,因为假如对象是继承而来的话,会多些数据),首先看看dataPtr,他是个指针,指向右边的表格,而这个表格,放的就是成员变量了(也就是说类中的属性)例如,data1,data2.而funPtr
放的也是个指针,但是这个指针所指向的表格有点特别,因为,表格的每一项的大小都是相等的,一般是4个字节为一项,放的是个成员函数的入口地址,但是要注意,他所放的虚函数的入口地址,也就是virtual member function而不是nonvirtual member function.这些入口函数的入口地址,在编译时由编译器写入。而funPtr则是当程式运行,并创建对象时由构造函数,或都=拷贝运算符动态写入的。我们再仔细看看这个函数表格的第一项,我没有给他写上任何东西,那是因为,他能常不会放函数的入口地址,他可能会放一些指向别的对像的指针,如type_info类型的对象,这是个描述一个对像的RTTI(runtime type info)的对象,在他的前而还可能是会有一些项放的即不是对象指针也不是函数入口地址,他放的是一些偏移量(当这个对像是由虚拟继承而来的话),Sun公司,及cfont的某个版本的编译器,假如我没记错的话就是用这个原理来实现类的虚拟继承,但是MSVC 的编译不是这样的,这里不想多说,因为我们的主题不在这。
如了说到了这里我想您会想到一我在第一贴里提到的,组件和客户程式,只要接口不变,那么后续的组件,对于客户原来的应用程式,不用再编译,链接就能使用的原理所在了。答案就在于对像的funPtr的指针上,他并不是由编译器给固定成某个值,而是随着组件程式的改变而不断的改变的,他的值是在过行时才确定的。所以客户的应用程式不用编译,链接就能远行,也就是说,组件的方法,一定要用C 的虚函数才能实现。要有一层的间隔才能灵活,富有弹性。我们还注意到,表格驱动的对象模型连数据都是间接访问,说明他也能让客户时进行直接访问,不但仅局限于接口能让客户使用。现在我们来看看C 的对象模型,他的数据并没有像表格驱动的对象模型那样具用间接性,所以,客户就不能直接访问,而只有接口了,这就是为什么COM只能提供接口让客户访问的原因,那么是不是C 对象模型编出来的组像就不能提供,属性访问呢。就我个人来说,不是的。C 对象模型同样能编出即能提供接口也能提供性性访问的组件,但是这种组件就不能再称为COM了吧。但是我不敢下结论因为我没有看过COM规范的原文,不知道COM是不是也把直接拱属性访问作为他的标准。下一次我将编一个支持属性直接访问的组件(提示,得用到虚拟继承)




标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇: 简单谈谈组件及COM---我的第一帖

下一篇: 井字游戏(C 版)

热门词条
热门标签