描述:
如果我想设计两个接口,命名为IA与IB,其中IA中有一个f1()的方法,IB从IA继承,而且另外有一个f2()的方法,我想在两个类中CA与CB具体实现。
IDL文件如下:
import "oaidl.idl";
import "ocidl.idl";
[
object,
uuid(0BDAAEA2-5D45-455E-8EF5-29906D6FBBBC),
dual,
helpstring("IA Interface"),
pointer_default(unique)
]
interface IA : IDispatch
{
[id(1), helpstring("method f1")] HRESULT f1();
};
[
object,
uuid(22538202-9CED-4324-9821-07F3984B4033),
dual,
helpstring("IB Interface"),
pointer_default(unique)
]
interface IB : IA
{
[id(2), helpstring("method f2")] HRESULT f2();
};
[
uuid(3DF7AD71-683C-4E85-94AE-C53B67CD8E3F),
version(1.0),
helpstring("Question 1.0 Type Library")
]
library QUESTIONLib
{
importlib("stdole32.tlb");
importlib("stdole2.tlb");
[
uuid(283DEB10-D082-4240-BC14-E74AFDC56E20),
helpstring("A Class")
]
coclass A
{
[default] interface IA;
};
[
uuid(F0EC3A7B-4426-427F-91B2-FAA24C8528B8),
helpstring("B Class")
]
coclass B
{
[default] interface IB;
};
};
而CA的头文件定义如下:
// A.h : Declaration of the CA
#ifndef __A_H_
#define __A_H_
#include "resource.h" // main symbols
/////////////////////////////////////////////////////////////////////////////
// CA
class ATL_NO_VTABLE CA :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CA, &CLSID_A>,
public IDispatchImpl<IA, &IID_IA, &LIBID_QUESTIONLib>
{
public:
CA()
{
}
DECLARE_REGISTRY_RESOURCEID(IDR_A)
DECLARE_PROTECT_FINAL_CONSTRUCT()
BEGIN_COM_MAP(CA)
COM_INTERFACE_ENTRY(IA)
COM_INTERFACE_ENTRY(IDispatch)
END_COM_MAP()
// IA
public:
STDMETHOD(f1)();
};
#endif //__A_H_
问题是CB的头文件,为什么必须在CB中也实现f1()方法了。
// B.h : Declaration of the CB
#ifndef __B_H_
#define __B_H_
#include "resource.h" // main symbols
/////////////////////////////////////////////////////////////////////////////
// CB
class ATL_NO_VTABLE CB :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CB, &CLSID_B>,
public IDispatchImpl<IB, &IID_IB, &LIBID_QUESTIONLib>
{
public:
CB()
{
}
DECLARE_REGISTRY_RESOURCEID(IDR_B)
DECLARE_PROTECT_FINAL_CONSTRUCT()
BEGIN_COM_MAP(CB)
COM_INTERFACE_ENTRY(IB)
COM_INTERFACE_ENTRY(IDispatch)
END_COM_MAP()
// IB
public:
STDMETHOD(f2)();
//IA
STDMETHOD(f1)();//???????此处必须有,否则编译报错。
};
#endif //__B_H_
当然如果在一个类中实现这两个接口可以避免两次实现,这个我懂,我想问在两个类的实现中有没有办法,在继承类中直接利用基类的方法,而不需要再实现一遍。
我第一次提问,可能描述不清楚,请高手们参考我的程序部分。
谢谢。
解决方案1:
完全可以的啊,
class IAImp
{
STDMETHOD(f1)(){ ...}
}
class ATL_NO_VTABLE CA :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CA, &CLSID_A>,
public IDispatchImpl<IA, &IID_IA, &LIBID_QUESTIONLib>
{
}