Templates ATL COM-如何为接口方法重用代码
我有几个接口,例如IA、IB、IC等,它们共享公共属性,例如站点。我想知道如何重用这些接口的代码,请将答案保存在COM聚合上 目前的执行情况如下:Templates ATL COM-如何为接口方法重用代码,templates,visual-c++,inheritance,com,atl,Templates,Visual C++,Inheritance,Com,Atl,我有几个接口,例如IA、IB、IC等,它们共享公共属性,例如站点。我想知道如何重用这些接口的代码,请将答案保存在COM聚合上 目前的执行情况如下: class CA // ATL specific... { STDMETHODIMP get_Site(...) {...} STDMETHODIMP put_Site(...) {...} } class BA // ATL specific... { STDMETHODIMP get_Site(...) {...}
class CA
// ATL specific...
{
STDMETHODIMP get_Site(...) {...}
STDMETHODIMP put_Site(...) {...}
}
class BA
// ATL specific...
{
STDMETHODIMP get_Site(...) {...}
STDMETHODIMP put_Site(...) {...}
}
class CC
// ATL specific...
{
STDMETHODIMP get_Site(...) {...}
STDMETHODIMP put_Site(...) {...}
}
我想实现但无法实现的是如下
template<typename T>
class SharedProperties
{
STDMETHODIMP get_Site(...) {...}
STDMETHODIMP put_Site(...) {...}
}
class CA :
// ATL specific...
SharedProperties<CA>
{
// properties are inherited and are accessible from IC
}
class BA
// ATL specific...
SharedProperties<CB>
{
// properties are inherited and are accessible from IB
}
class CC
// ATL specific...
SharedProperties<CC>
{
// properties are inherited and are accessible from IA
}
我在阅读后发现了这个想法,但是这个网站没有一个有效的例子,无论我怎么努力,我都无法让它工作。我无法实例化抽象类,因为纯虚拟函数get\u Site和put\u Site没有按照第二个代码段实现
编辑
请注意,我使用的是VS2010。示例实现如下:
class ATL_NO_VTABLE CArticle :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CArticle, &CLSID_Article>,
public IDispatchImpl<IArticle, &IID_IArticle, &LIBID_GeodeEdiLib, /*wMajor =*/ 1, /*wMinor =*/ 0>
{
public:
CArticle()
{
}
编译器不知道方法get_Site和put_Site是否从接口实现这些方法。您需要从相应的接口继承SharedProperties类模板。这就是让SharedProperties成为模板的理由
interface IA
{
STDMETHOD(get_Site)() = 0;
STDMETHOD(put_Site)() = 0;
};
template<typename T>
class Sharedproperties : T
{
public:
STDMETHODIMP get_Site() { return E_NOTIMPL; };
STDMETHODIMP put_Site() { return E_NOTIMPL; };
};
class CAX : public IA
{
STDMETHOD(other)() { return S_OK; }
}
class CA: public Sharedproperties<CAX>
{
public:
CA() {}
};
哪个类是抽象的,不能实例化?SharedProperties::get\u Site和SharedProperties::put\u Site不应该是虚拟的吗?它们是虚拟的,但如果你熟悉ATL,我相信你会明白这一点。该代码段不是实际的源代码。它只是为了说明的目的,没有办法,你需要定义一个所有这些类都实现的IShared接口。缺点是客户机代码必须对其进行QI,就像聚合一样。您必须在每个中编写Site方法,您可以委托给公共实现。您已经在继承层次结构中放置了一个中间类。这是一个简洁的解决方案,但在ATL上下文中不起作用,因为类CA不直接从IA继承。在这种情况下,类模板必须从中间类继承。我已经编辑了示例代码来说明这个案例。这很奇怪,但您的解决方案确实有意义。有关VS2010生成的代码,请参阅我编辑的文章。
class ATL_NO_VTABLE CMyObject :
public CComObjectRootEx<CComMultiThreadModel>,
public CComCoClass<CMyObject, &CLSID_MyObject>,
IMyObject
class ATL_NO_VTABLE CMyObject :
public CComObjectRootEx<CComMultiThreadModel>,
public CComCoClass<CMyObject, &CLSID_MyObject>,
public Sharedproperties<MyIntermediateClass>