我有几个接口,例如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(根据第二个片段)。
修改 请注意我使用的是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()
{
}
答案 0 :(得分:0)
编译器不知道方法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() {}
};
请注意,CA类不直接从接口IA继承。
编辑: VS2008类向导为简单的ATL类对象生成此继承:
class ATL_NO_VTABLE CMyObject :
public CComObjectRootEx<CComMultiThreadModel>,
public CComCoClass<CMyObject, &CLSID_MyObject>,
IMyObject
其中IMyObject
是IDL定义的接口。所以在ATL上下文中你只需要替换IMyObject继承:
class ATL_NO_VTABLE CMyObject :
public CComObjectRootEx<CComMultiThreadModel>,
public CComCoClass<CMyObject, &CLSID_MyObject>,
public Sharedproperties<MyIntermediateClass>