前一些章节已经讲述了COM的基本规范以及COM实现的细节

上传人:新** 文档编号:576227546 上传时间:2024-08-19 格式:PPT 页数:16 大小:108KB
返回 下载 相关 举报
前一些章节已经讲述了COM的基本规范以及COM实现的细节_第1页
第1页 / 共16页
前一些章节已经讲述了COM的基本规范以及COM实现的细节_第2页
第2页 / 共16页
前一些章节已经讲述了COM的基本规范以及COM实现的细节_第3页
第3页 / 共16页
前一些章节已经讲述了COM的基本规范以及COM实现的细节_第4页
第4页 / 共16页
前一些章节已经讲述了COM的基本规范以及COM实现的细节_第5页
第5页 / 共16页
点击查看更多>>
资源描述

《前一些章节已经讲述了COM的基本规范以及COM实现的细节》由会员分享,可在线阅读,更多相关《前一些章节已经讲述了COM的基本规范以及COM实现的细节(16页珍藏版)》请在金锄头文库上搜索。

1、第四章第四章 COM特性特性n n前一些章节已经讲述了前一些章节已经讲述了COMCOM的基本规范以及的基本规范以及COMCOM实现的细节。现实现的细节。现在就可以编写真正的组件了。在就可以编写真正的组件了。n n可以把大的系统分解成一些小的组件对象,每个组件对象按照可以把大的系统分解成一些小的组件对象,每个组件对象按照COMCOM规范来实现,再编写一个或多个客户程序调用这些组件,组规范来实现,再编写一个或多个客户程序调用这些组件,组件之间或组件与客户之间通过件之间或组件与客户之间通过COMCOM接口进行通信。简单的程序这接口进行通信。简单的程序这样做就可以了。样做就可以了。2021/6/201

2、4.1 可重用性:包容和聚合可重用性:包容和聚合n n面向对象系统的三个最基本的特性分别是:封装、多态、重用面向对象系统的三个最基本的特性分别是:封装、多态、重用n n封装性体现在对所有对象状态信息的访问只能通过接口来访问。封装性体现在对所有对象状态信息的访问只能通过接口来访问。n n多态性主要体现在三个层次上:接口成员函数、单个接口、一组多态性主要体现在三个层次上:接口成员函数、单个接口、一组接口接口n n所谓重用是指:当一个程序单元能够对其它的程序单元提供服务所谓重用是指:当一个程序单元能够对其它的程序单元提供服务时,尽可能地重用原先单元程序地代码,既可以在源代码一级重时,尽可能地重用原先

3、单元程序地代码,既可以在源代码一级重用,也可以在可执行代码一级重用。用,也可以在可执行代码一级重用。C+C+语言地重用性位于源代语言地重用性位于源代码一级;而码一级;而COMCOM是建立在二进制一级上地标准,因此重用性也必是建立在二进制一级上地标准,因此重用性也必然建立在二进制一级。然建立在二进制一级。2021/6/2024.1.1 包容和聚合包容和聚合n n包容和聚合是包容和聚合是COMCOM地两种重用模型。地两种重用模型。n n包容:包容: 假如已经实现了一个假如已经实现了一个COMCOM对象对象A A,他是现了接口,他是现了接口ISomeInterfaceISomeInterface,在

4、,在此还要实现另一个此还要实现另一个COMCOM对象对象B B,这个,这个COMCOM对象既要实现接口对象既要实现接口ISomeInterfaceISomeInterface,也要实现接口,也要实现接口IOtherInterfaceIOtherInterface,而且,而且, ISomeInterfaceISomeInterface接口所提供地服务与对象接口所提供地服务与对象A A的接口所提供的服务基的接口所提供的服务基本一致,这样就可以重用对象本一致,这样就可以重用对象A A来实现对象来实现对象B B的接口功能。的接口功能。 最简单的办法是:在实现对象最简单的办法是:在实现对象B B的接口的

5、接口ISomeInterfaceISomeInterface时调用对象时调用对象A A的相应成员函数,对于对象的相应成员函数,对于对象A A来说,它只是当作一个普通的来说,它只是当作一个普通的COMCOM对象,而对于对象对象,而对于对象B B来说,虽然它本身是一个来说,虽然它本身是一个COMCOM对象,但同时对象,但同时也是对象也是对象A A的客户,因为他调用对象的客户,因为他调用对象A A的功能服务。对于对象的功能服务。对于对象B B的的客户来说,他根本就不知道对象客户来说,他根本就不知道对象A A的存在。的存在。 包容模型在实际使用过程中可以非常灵活,对象包容模型在实际使用过程中可以非常灵

6、活,对象B B的成员函数在调的成员函数在调用对象用对象A A的接口成员之前或者调用返回之后也可以进行其它一些的接口成员之前或者调用返回之后也可以进行其它一些操作,因此,对象操作,因此,对象B B的的ISomeInterfaceISomeInterface接口提供的功能可以超出对接口提供的功能可以超出对象象A A的接口功能,返回结果也可以不一致。的接口功能,返回结果也可以不一致。2021/6/203包容和聚合包容和聚合n n对象对象A A和对象和对象B B可以只是一个服务器与客户的关系。可以只是一个服务器与客户的关系。n n对象对象A A的创建和释放完全在对象的创建和释放完全在对象B B内部进行

7、。对象内部进行。对象B B构造时,同时构造时,同时创建对象创建对象A A的接口指针,以便自阿对象的接口指针,以便自阿对象B B的成员函数中使用;当对的成员函数中使用;当对象象B B被释放时,它先释放对象被释放时,它先释放对象A A,这样可以完成对象,这样可以完成对象B B对对象对对象A A的的篏套使用,形成包容。要对其优化,便可在对象篏套使用,形成包容。要对其优化,便可在对象B B需要时创建对需要时创建对象象A A,在不需要时释放对象,在不需要时释放对象A A。n n聚合:聚合: 对象对象B B要实现两个接口要实现两个接口ISomeInterfaceISomeInterface和和IOther

8、InterfaceIOtherInterface,而对象,而对象A A实实现了现了ISomeInterfaceISomeInterface接口,并且不要对此接口进行修改便可满足对接口,并且不要对此接口进行修改便可满足对象象B B的要求。如果采用包容模型,那么对象的要求。如果采用包容模型,那么对象B B要实现两个接口,并要实现两个接口,并且在且在ISomeInterfaceISomeInterface接口的成员函数中调用对象接口的成员函数中调用对象A A的相应函数,采的相应函数,采用聚合则不一样。对象用聚合则不一样。对象B B本生不实现接口本生不实现接口ISomeInterfaceISomeIn

9、terface,他只实,他只实现现IOtherInterfaceIOtherInterface接口,但它也能提供接口接口,但它也能提供接口ISomeInterfaceISomeInterface的功能,的功能,当对象当对象B B的客户请求接口的客户请求接口ISomeInterfaceISomeInterface时,对象时,对象B B把对象把对象A A的的ISomeInterfaceISomeInterface接口暴露给客户,因此,客户调用接口暴露给客户,因此,客户调用ISomeInterfaceISomeInterface是是直接与对象直接与对象A A进行交互的,而客户知道的只是对象进行交互的

10、,而客户知道的只是对象B B。2021/6/204包容和聚合包容和聚合n n在交互模型中,被聚合的对象在交互模型中,被聚合的对象A A虽然直接向对象虽然直接向对象B B的客户提供功能服务,的客户提供功能服务,但它的生存周期受对象但它的生存周期受对象B B控制,而且其它的一些行为也受到对象控制,而且其它的一些行为也受到对象B B控制,控制,包括内部状态初始化、获取数据等。包括内部状态初始化、获取数据等。n n实现交互的关键在于对象实现交互的关键在于对象B B的的QueryInterfaceQueryInterface成员函数,当客户向对象成员函数,当客户向对象B B请请求求ISomeInterf

11、aceISomeInterface接口时,对象接口时,对象B B的的QueryInterfaceQueryInterface函数把对象函数把对象A A的的ISomeInterfaceISomeInterface接口指针放到输出参数中,客户程序就获得了对象接口指针放到输出参数中,客户程序就获得了对象A A的的ISomeInterfaceISomeInterface接口指针,可以直接调用接口成员函数了。接口指针,可以直接调用接口成员函数了。n n这样还是有问题的,问题在于:当客户程序通过这样还是有问题的,问题在于:当客户程序通过ISomeInterface:QueryInterfaceISomeI

12、nterface:QueryInterface函数又请求其它的接口指针时,问题就出函数又请求其它的接口指针时,问题就出现了。因为对象现了。因为对象A A并不知道对象并不知道对象B B实现可什么样的接口,而根据实现可什么样的接口,而根据COMCOM规范,规范,客户程序从对象客户程序从对象B B的任何一个接口可以获取其它的任何接口指针。而且,的任何一个接口可以获取其它的任何接口指针。而且,在正常情况下,客户程序调用对象在正常情况下,客户程序调用对象A A的的ISomeInterface:QueryInterfaceISomeInterface:QueryInterface函数函数请求请求IUnkn

13、ownIUnknown接口指针获取的是对象接口指针获取的是对象A A的的InnknownInnknown接口指针,而客户程接口指针,而客户程序调用对象序调用对象B B的的IOtherInterface:QueryInterfaceIOtherInterface:QueryInterface函数请求函数请求IUknownIUknown接口指针接口指针获取的是对象获取的是对象B B的的IUknownIUknown接口指针,而接口指针,而COMCOM规范要求的规范要求的IUknownIUknown接口指接口指针必须唯一。因此,为了使聚合顺利实现,对象针必须唯一。因此,为了使聚合顺利实现,对象A A也

14、必须能够适应在被也必须能够适应在被聚合的情况下进行的特殊处理,尤其是接口的聚合的情况下进行的特殊处理,尤其是接口的QueryInterfaceQueryInterface成员函数,成员函数,在被聚合的情况下,当客户请求它所不支持的接口或请求在被聚合的情况下,当客户请求它所不支持的接口或请求IkknownIkknown接口时,接口时,它必须把控制交给外部对象,有外部对象决定客户程序的请求结果。它必须把控制交给外部对象,有外部对象决定客户程序的请求结果。2021/6/205包容和聚合包容和聚合n n选择重用模型依据的原则如下:选择重用模型依据的原则如下: 在一个组件对象在行为上更类似于另一个组件对

15、象的客户,并且它在一个组件对象在行为上更类似于另一个组件对象的客户,并且它要调用第二个对象的某些对象接口的情况下,适合用包容模型。要调用第二个对象的某些对象接口的情况下,适合用包容模型。如果一个现成的组件对象所实现的接口与将要实现的对象的接口如果一个现成的组件对象所实现的接口与将要实现的对象的接口的行为完全一致,则采用聚合模型更为适合,当然前提条件是现的行为完全一致,则采用聚合模型更为适合,当然前提条件是现有的组件对象必须支持聚合特性才行。有的组件对象必须支持聚合特性才行。n n包容和聚合是包容和聚合是COMCOM对象的两种出模型,它们相互并不矛盾,因此对象的两种出模型,它们相互并不矛盾,因此

16、可以在一个对象中同时使用两种模型,有的接口通过包容实现,可以在一个对象中同时使用两种模型,有的接口通过包容实现,有的接口通过聚合实现。有的接口通过聚合实现。2021/6/206包容实现包容实现n n内部对象内部对象A A实现了接口实现了接口ISomeIntefaceISomeInteface,外部对象,外部对象B B要实现接口要实现接口ISomeInterfaceISomeInterface和和IOtherInterfaceIOtherInterface,其接口如下定义:,其接口如下定义: class ISomeInterface:public Iuknown class ISomeInter

17、face:public Iuknown public: public: virtual HRESULT_stdcall SomeFunction()=0; virtual HRESULT_stdcall SomeFunction()=0; ; ; class IOtherInterface:public Iuknown class IOtherInterface:public Iuknown public: public: virtual HRESULT_stdcall OtherFunction()=0; virtual HRESULT_stdcall OtherFunction()=0;

18、; ; 在客户程序、组件对象在客户程序、组件对象A A和组件对象和组件对象B B三者之中,三者之中,B B包容包容A A,客户程,客户程序只知道对象序只知道对象B B的存在,实际上对象的存在,实际上对象B B是对象是对象A A的客户,负责对象的客户,负责对象A A的创建、调用和释放等工作。的创建、调用和释放等工作。2021/6/207包容实现包容实现n n列出其列出其C+C+定义如下:定义如下: class CB:public ISomeInterface,public IOtherInterface class CB:public ISomeInterface,public IOtherIn

19、terface protected: protected: Ulong m_ref; Ulong m_ref; public: public: CB(); CB(); CB(); CB(); / /成员函数成员函数 HRESULE Init(); HRESULE Init(); private: private: ISomeInterface * m_pSomeInteface; ISomeInterface * m_pSomeInteface; 因为对象因为对象B B包容对象包容对象A A,所以在对象,所以在对象B B的成员函数中要调用对象的成员函数中要调用对象A A的的接口成员函数,因此在

20、对象接口成员函数,因此在对象B B的定义中加了数据成员的定义中加了数据成员m_pSomeIntefacem_pSomeInteface,记录对象,记录对象A A的接口指针。的接口指针。2021/6/208包容实现包容实现n n类类CBCB的实现:的实现: CB:CB() CB:CB() m_pSomeInteface=NULL; m_pSomeInteface=NULL; m_ref=0; m_ref=0; CB:CB() CB:CB() if(m_pSomeInteface=NULL) if(m_pSomeInteface=NULL) m_pSomeInteface-Release(); m

21、_pSomeInteface-Release(); HRESULT CB:Init() HRESULT CB:Init() HRESULT HRESULT result=:CoCreateInstance(CLSID_ComponentA,Null,CLSCTX_INPROCresult=:CoCreateInstance(CLSID_ComponentA,Null,CLSCTX_INPROC_SERVER,IID_ISomeInterface,(void * *) &m_pSomeInteface) _SERVER,IID_ISomeInterface,(void * *) &m_pSome

22、Inteface) HRESULT _stdcall CB:SomeFunction() HRESULT _stdcall CB:SomeFunction() return m_pSomeInteface-SomeFunction(); return m_pSomeInteface-SomeFunction();2021/6/209包容实现包容实现n n需要对其进行说明如下:需要对其进行说明如下: (1) (1) 在在InitInit成员函数中,对象成员函数中,对象B B创建了包容对象创建了包容对象A A,只要创建成功,则,只要创建成功,则数据成员数据成员m_pSomeIntefacem_pS

23、omeInteface记录了对象记录了对象A A的的ISomeIntefaceISomeInteface接口指针;接口指针;当对象当对象B B被析构时,通过调用对象被析构时,通过调用对象A A的的ReleaseRelease成员释放对象成员释放对象A A。 (2) (2) 在对象在对象B B实现接口实现接口ISomeIntefaceISomeInteface的成员的成员SomeFunctionSomeFunction函数时,只是函数时,只是调用了对象调用了对象A A的相应函数,出的概念在此体现出来。的相应函数,出的概念在此体现出来。 可以在对象初始化构造时调用可以在对象初始化构造时调用Init

24、Init成员函数,因此对对象成员函数,因此对对象B B的类厂的的类厂的CreateInstanceCreateInstance成员函数的实现有所不同,其如下:成员函数的实现有所不同,其如下: HRESULT CBFactory:CreateInstance() HRESULT CBFactory:CreateInstance() pObj=new CB(); pObj=new CB(); if(pObj=NULL) if(pObj=NULL) hr=pObj-Init(); hr=pObj-Init(); if() if() hr=pObj-QueryInterface(iid,ppv); h

25、r=pObj-QueryInterface(iid,ppv); return hr; return hr;2021/6/2010包容实现包容实现n n当要对接口进行扩展时,可以通过接口继承来实现接口的扩展,当要对接口进行扩展时,可以通过接口继承来实现接口的扩展,在实现新的接口时可以一个包容来重用以前的组件。例如,定义在实现新的接口时可以一个包容来重用以前的组件。例如,定义新的接口新的接口ISomeInterfaceEXISomeInterfaceEX对接口对接口ISomeInterfaceISomeInterface进行扩展,其定进行扩展,其定义如下:义如下: class ISomeInter

26、faceEX:public ISomeInterface class ISomeInterfaceEX:public ISomeInterface public: public: virtual HRESULE _stdcall NewFunction()=0; virtual HRESULE _stdcall NewFunction()=0; ISomeInterfaceEX ISomeInterfaceEX接口可以重用已经实现的接口可以重用已经实现的ISomeInterfaceISomeInterface接口。实接口。实际上新的对象只要实现新加的成员函数际上新的对象只要实现新加的成员函数N

27、ewFunctionNewFunction即可,而即可,而SomeFunctionSomeFunction成员函数可以直接调用成员函数可以直接调用m_pSomeInterfacem_pSomeInterface的成员实现。的成员实现。如果新的对象的类名仍为如果新的对象的类名仍为CBCB,则代码如下:,则代码如下: virtual HRESULE _stdcall CB:SomeFunction() virtual HRESULE _stdcall CB:SomeFunction() return m_pSomeInterface- SomeFunction(); return m_pSomeI

28、nterface- SomeFunction();2021/6/2011包容实现包容实现n n在包容模型中,外部对象重用内部对象的接口时,可以是简单的在包容模型中,外部对象重用内部对象的接口时,可以是简单的调用关系,也可以在调用内部对象接口成员函数之前或之后加上调用关系,也可以在调用内部对象接口成员函数之前或之后加上其它的处理,甚至在某些情况下可以加上一些条件处理,比如下其它的处理,甚至在某些情况下可以加上一些条件处理,比如下面的情况是有可能的:面的情况是有可能的: HRESULT _stdcall CB:SomeFunction() HRESULT _stdcall CB:SomeFunct

29、ion() if() if() else else HRESULT result=m_pSomeInterface-SomeFunction(); HRESULT result=m_pSomeInterface-SomeFunction(); return result; return result; 总之,包容模型的实质是客户组件的关系,在实现外部对象时总之,包容模型的实质是客户组件的关系,在实现外部对象时可以灵活使用。可以灵活使用。2021/6/20124.1.3 聚合实现聚合实现2021/6/20132021/6/20142021/6/2015部分资料从网络收集整理而来,供大家参考,感谢您的关注!

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号