サイトなどの共通のプロパティを共有する、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が実装されていないため(2番目のスニペットのように)、「抽象クラスをインスタンス化できません」というメッセージが表示され続けます。
編集 私は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()
{
}