2012-05-28 4 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을 사용하고 있습니다. 컴파일러는 방법 get_Siteput_Site이 인터페이스의 메소드를 구현하는 것이 모르는

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

: 아래의 샘플 구현입니다. 해당 인터페이스에서 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 클래스 오브젝트이 상속 생성 IMyObject

class ATL_NO_VTABLE CMyObject : 
    public CComObjectRootEx<CComMultiThreadModel>, 
    public CComCoClass<CMyObject, &CLSID_MyObject>, 
    IMyObject 

IDL의 인터페이스에서 정의. 따라서 ATL 컨텍스트에서 IMyObject 상속을 대체하면됩니다.

class ATL_NO_VTABLE CMyObject : 
    public CComObjectRootEx<CComMultiThreadModel>, 
    public CComCoClass<CMyObject, &CLSID_MyObject>, 
    public Sharedproperties<MyIntermediateClass> 
+0

상속 계층 구조에 중간 클래스를 추가했습니다. 그것은 깔끔한 해결책이지만 클래스 CA가 IA로부터 직접 * 상속하지 않기 때문에 ATL의 컨텍스트에서 작동하지 않습니다. – Telemat

+0

이 경우 클래스 템플릿은 중간 클래스에서 상속해야합니다. 이 예제를 설명하기 위해 샘플 코드를 편집했습니다. – harper

+0

이상한 일이지만 솔루션이 의미가 있습니다. VS2010에 의해 생성 된 코드는 내 편집 된 게시물을 참조하십시오. – Telemat

관련 문제