c++的抽象類別可以作為介面,實現事件回調等機制.
介面實現檔案IDemoImpl.cpp
#include <stdio.h>#include "IDemo.h"IDemo::IDemo(){}IDemo::~IDemo(){}class CDemoImpl : public IDemo{public:CDemoImpl(){};~CDemoImpl(){};public:virtual int Add(int a, int b){return (a+b);}virtual int Sub(int a, int b){return (a-b);}};IDemo * GetInstance(void){return new CDemoImpl();}
介面檔案IDemo.h
#ifndef _IDEMO_H_#define _IDEMO_H_class IDemo{public:IDemo();virtual ~IDemo();public:virtual int Add(int, int) = 0;virtual int Sub(int, int) = 0;};IDemo * GetInstance(void);#endif
對象的用戶端可以這樣調用
#include "IDemo.h"int main(void){ IDemo * pDemo = GetInstance(); printf("%d\n", pDemo->Add(1,2));}
如果把IDemoImpl.cpp編譯到dll或者so裡面,然後只發布介面檔案IDemo.h和二進位的實現,就有了一點com的雛形了。
這個GetInstance()還是太簡單了,如果可以改成更具某個id去指定擷取不同的對象,
比如GetInstance(const char * uuid), 那麼這個函數就有了一些ms的IUnkown介面的QueryInterface()的意思了。
HRESULT QueryInterface( [in] REFIID riid, [out] void **ppvObject);
參考QueryInterface的樣子,實現一個GetInstance()
void * GetInstance(const char * uuid){ if (!strcmp(uuid, "uuid_add") return new CDemoAddImpl(); if (!strcmp(uuid, "uuid_sub") return new CDemoSubImpl(); return (void *) 0;}
修改一個新的IDemo.h
#ifndef _IDEMO_H_#define _IDEMO_H_#ifdef __cplusplusextern "C"{#endifvoid * GetInstance(const char * uuid);#ifdef __cplusplus};#endif#endif
分開不同功能的介面定義
IDemoAdd.h
#ifndef _IDEMO_ADD_H_#define _IDEMO_ADD_H_class IDemoAdd{public:IDemoAdd();virtual ~IDemoAdd();public:virtual int Add(int, int) = 0;}#endif
IDemoSub.h
#ifndef _IDEMO_SUB_H_#define _IDEMO_SUB_H_class IDemoSub{public:IDemoSub();virtual ~IDemoSub();public:virtual int Sub(int, int) = 0;}#endif
分別在2個cpp檔案裡面用CDemoAddImpl類和CDemoSubImpl類, 來實現Add()和Sub()方法(略)
然後把實現的cpp編譯成二進位的dll或者so檔案,連同3個標頭檔(IDemo.h IDemoAdd.h IDemoSub.h)一起發布給用戶端。
用戶端調用可以這樣:
#include <stdio.h>#include "IDemo.h"#include "IDemoAdd.h"#include "IDemoSub.h"int main(void){ IDemoAdd * pAdd = GetInstance("uuid_add"); if (pAdd) pAdd->Add(1,2); IDemoSub * pSub = GetInstance("uuid_sub"); pSub->Sub(1,2); return 0;}
總結一下:
com的基本思想就是公開對象介面(標頭檔),但是隱藏對象介面實現的細節(二進位庫)。通過這些介面定義,用戶端可以在二進位的層面像搭積木一樣mashup出來新的軟體,進而達到軟體複用的目的.