2014-04-14 3 views
2

기본적으로 다른 클래스에서 같은 클래스의 다른 객체와의 관계를보고하도록 요청하는 클래스가 있습니다. 훌륭하게 작동합니다. FYI이 클래스는 프로토콜을 나타냅니다. 불행히도 이제 Wrapper라는 클래스를 추가하여 클래스 관계를 꾸미려고합니다. 이 클래스의 주 전원은 (같은 않습니다 또는 다른 것) 인수 : 내가 다른 디자인 이유 체결 한 어떤가상 함수에 대한 매개 변수로서의 서브 클래스 객체

template< class InnerInterpreter > 
class WrapperInterpreter 
{ 
public: 
    WrapperInterpreter(const InnerInterpreter &m) : innerMessage(m) {} 

    ... 

    virtual bool respondsToMessage(const WrapperInterpreter<InnerInterpreter> &) const = 0; 

public: 
    //member 
    InnerInterpreter innerMessage; 
}; 

이기 때문에 첫 수업을받을 수 있다는 것입니다있는 등이 필요 (두 개의 다른 프로토콜을 인수로 사용하는 대신) 래퍼 집합에 대한 기본 클래스를 사용하면 외부 및 내부 프로토콜 클래스의 결합 집합을 사용할 수 있습니다.

그래서 여기 내 문제입니다 : 내가 WrapperInterpreter<>를 서브 클래 싱 할 때, 특히 respondsToMessage()에 구현을 제공, 나는 WrapperInterpreter 계층 구조의 모든 클래스에 비교할 수있는 서브 클래스와 끝까지. 그러나 그것은 실제로 내가하고 싶은 것이 아닙니다. 나는 즉시 컴파일러를 단순히 WrapperInterpreter의 인터페이스에서 제거하고 단지 수 있도록했다 와서

template< class Inner > 
class ConcreteWrapper : WrapperInterpreter<Inner> 
{ 
    ... 
    bool respondsToMessage(const ConcreteWrapper<Inner> &); 
    ... 
} 

하나의 솔루션 누락 된 인터페이스에 대해 불평을 : 내가 뭘하고 싶은 thusly 히하는 방법을 구현하는 서브 클래스를 강제하는 것입니다 방법은 나머지 설계와 함께 사용할 때만 가능합니다. 서브 클래스는 매개 변수로 서브 클래스 타입의 객체를 가지고해야, 추상 클래스의 인터페이스 방법을 넣을 수있는 방법이 같은 :

그래서 제 질문은입니까?

또는 상속을 잘못 사용하려고합니까? 아무도이 문제를 해결하는 데 도움이 될만한 유용한 디자인 패턴을 가지고 있습니까?

템플릿 매개 변수로 부모아이의 유형을 지나가는 구성 CRTP (호기심 반복 템플릿 패턴)라는 디자인이

답변

1

:

template <typename Child> 
class WrapperInterpreter { 
    using Inner = typename Child::Inner; // nested typedef 

    WrapperInterpreter(Inner const& ...); 

    virtual bool respondsToMessage(Child const& ...) = 0; 
}; 

template <typename Inner> 
class Concrete: public WrapperInterpreter< Concrete<Inner> > { 

    virtual bool respondsToMessage(Concrete const& ...) override; 

}; 
관련 문제