2012-05-28 66 views
1

我有幾個接口,例如IA,IB,IC等等,它們具有共同的特性,例如,現場。我想知道如何重用這些接口的代碼(請保存我在COM聚合上的答案)。ATL 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

哪個類是抽象的,不能被實例化? – sharptooth

+0

「SharedProperties :: get_Site」和「SharedProperties :: put_Site」不應該是虛擬的嗎? –

+0

他們是,但如果你熟悉ATL我相信你會明白的。該片段不是實際的源代碼。它僅用於說明目的。 – Telemat

回答

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> 
+0

您已經在繼承層次結構中放置了一箇中間類。這是一個很好的解決方案,但它不適用於ATL,因爲CA不直接從IA繼承*。 – Telemat

+0

在這種情況下,類模板必須從中間類繼承。我編輯了示例代碼來說明這種情況。 – harper

+0

這很奇怪,但你的解決方案確實有道理。請參考我編輯的帖子,瞭解VS2010生成的代碼。 – Telemat