【发布时间】:2012-05-28 05:43:03
【问题描述】:
我有几个接口,例如IA、IB、IC 等,它们具有共同的属性,例如地点。我想知道如何重用这些接口的代码(请把关于 COM 聚合的答案留给我)。
目前的实现如下:
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
}
我在阅读 (http://vcfaq.mvps.org/com/7.htm) 后遇到了这个想法,但该网站没有一个可行的示例,无论我尝试了多少,我都无法让它发挥作用。我不断收到“无法实例化抽象类”,因为未实现纯虚函数 get_Site 和 put_Site(根据第二个 sn-p)。
编辑 请注意,我使用的是 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()
{
}
【问题讨论】:
-
哪个类是抽象的,不能实例化?
-
SharedProperties::get_Site和SharedProperties::put_Site不应该是虚拟的吗? -
它们是,但如果您熟悉 ATL,我相信您会明白这一点。 sn-p 不是实际的源代码。它仅用于说明目的。
-
不行,您需要定义所有这些类都实现的 IShared 接口。缺点是客户端代码必须对其进行 QI,就像聚合一样。您必须在每个中编写 Site 方法,您可以委托给一个通用实现。
标签: templates visual-c++ inheritance com atl