1

サイトなどの共通のプロパティを共有する、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()
    {
    }
4

1 に答える 1

0

コンパイラは、メソッドを認識せず、インターフェイスからメソッドget_Siteput_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>
于 2012-05-28T08:07:50.357 に答える