我们的代码库有很多COM对象,所以通常我们会有类似的东西:
//this is the IDL-generated IGetTime interface header
#include "gettime.h"
//our COM class implementation of IGetTime
class CGetTime : public IGetTime
{
public:
CGetTime(CGetTimeCF &factory,...); //COM-specific constructor params
/* IUnknown */
STDMETHODIMP QueryInterface(REFIID riid, LPVOID FAR * ppv);
STDMETHODIMP_(ULONG) AddRef();
STDMETHODIMP_(ULONG) Release();
/* IGetTime */
STDMETHODIMP GetTheTime(); //
};
构造函数和其他一些东西的设置方式,这个类只能通过COM轻松使用...你可以破解创建对象的方法,但它往往是片状的。但是我很多情况下,没有COM就可以使用该类的实际功能......如果可以new CGetTime();
我想知道这样的事情是一种模式:
class CGetTimeBase
{
public:
STDMETHODIMP GetTheTime();
};
class CGetTime : public IGetTime, public CGetTimeBase
{
...
};
这是一个很好的方法,还是有更好的方法让一个'普通的C ++'类提供核心功能,还有一个COM类做COM的东西?我想,为了尽可能减少要编写的代码量,我宁愿不介绍包装器方法,但是在非COM类中有实际的实现方法,因此它会自动出现在COM类中。
思考? };
答案 0 :(得分:5)
在我工作的地方,我们选择将核心C++
类与COM
类分开,原因如下:
更易于维护。那些不了解COM
的人可以专注于编写核心类,知道COM
的人可以安全地包装核心类,而无需关心底层实现。
代码可重用性。这可能不是您的要求,但由于核心类与COM
核心类分离,我们只能在C++
项目中直接使用它们,而不需要COM
。
核心测试。由于逻辑与接口分离,因此您可以轻松地进行最小化测试。你不再怀疑:“我的泄密在哪里?它是我的核心逻辑中的合法泄漏还是与COM
相关的东西?”核心课程可以独立有效地进行测试。
这会增加文件数量和编译时间,但我(我们)认为值得。