2011-08-29 4 views
0



디자인 질문 : 메시지 처리 구성 요소 ... 전화 incorect 과부하 기능 내가 메시지 처리 꼬추를 작성하려고 해요

. 주요 구성 요소는 수신기, 프로세서, 필터, 변환기 및 송신자입니다. 예외, 로깅 및 메트릭을 잡기 위해 프로세서 구성 요소의 "프로세스"기능에서 단일 실패 지점을 갖고 싶습니다.

콘솔 출력이 바로 아래에 있습니다. 오버 라이딩의 비트가 잘못 표시됩니다.

BASE 
A 
B 
A 


---FILTER--- 
FILTERED BASE 
DID NOT FILTER A 
Looks like a B  <------THIS IS WHAT I WANT 
DID NOT FILTER B 


---PROCESS--- 
FILTERED BASE 
DID NOT FILTER A 
DID NOT FILTER B <-----THIS MAKES ME SAD 

이 클래스 정의 내가 처리 기능은 필터를 호출 할 ... 아래

#include <string> 
#include <iostream> 
#include <memory> 
//**************MESSAGES ************************ 
class Message 
{ 
public: 
    virtual std::string getOut() const {return std::string("BASE");}; 
}; 

class MsgA : public Message 
{ 
public: 
    std::string getOut() const {return std::string("A");}; 
}; 

class MsgB : public Message 
{ 
public: 
    std::string getOut() const {return std::string("B");}; 
}; 


//**************FILTERS ************************ 
class MsgFilter 
{ 
public: 
    void filter(const std::tr1::shared_ptr<Message> msg) 
    { 
     if(msg->getOut().compare("BASE") == 0) 
     { 
      std::cout << "FILTERED BASE" << std::endl; 
     } 
     else 
     { 
      std::cout << "DID NOT FILTER " << msg->getOut() << std::endl; 
     } 
    } 
    void filter(const std::tr1::shared_ptr<MsgB> msg) 
    { 
     std::cout << "Looks like a B" << std::endl; 
     filter((std::tr1::shared_ptr<Message>)msg); 
    } 
}; 

//**************PROCESSORS ************************ 
class MsgProcessor 
{ 
public: 
    MsgProcessor():myFilt(MsgFilter()){} 
    MsgFilter myFilt; 
    virtual void process(std::tr1::shared_ptr<Message> msg) 
    { 
     myFilt.filter(msg); 
    } 
}; 

의 주요 기능

#include "AllClassDefs.h" 

int main(int argc, char *argv[]) 
{ 
    std::tr1::shared_ptr<Message> msg(new Message()); 
    std::tr1::shared_ptr<MsgA> msgA(new MsgA()); 
    std::tr1::shared_ptr<MsgB> msgB(new MsgB()); 

    std::cout << msg->getOut() << std::endl; 
    std::cout << msgA->getOut() << std::endl; 
    std::cout << msgB->getOut() << std::endl; 

    std::tr1::shared_ptr<Message> msgAPtr(msgA); 
    std::cout << msgAPtr->getOut() << std::endl; 

    std::cout <<"\n\nFILTER---\n"; 

    std::tr1::shared_ptr<MsgFilter> flt(new MsgFilter()); 
    flt->filter(msg); 
    flt->filter((std::tr1::shared_ptr<Message>) msgA); 
    flt->filter(msgB); 

    std::cout <<"\n\nPROCESS---\n"; 

    std::tr1::shared_ptr<MsgProcessor> prc(new MsgProcessor()); 
    prc->process(msg); 
    prc->process(msgA); 
    prc->process(msgB); 
} 

입니다 그래서이다 (MsgB) 기능과하지 필터 (메시지) 기능. 프로세스 (메시지) 기능을 사용하면 Filter가 MsgB를 메시지로 취급합니다. 어떻게하면 잘 작동하게 할 수 있습니까?
템플릿을 사용할 수는 있지만 과장된 것 같습니다. 몇 가지 메시지 클래스가있는 시스템에서 큰 exe로 이어질 수 있습니다. 이중 발송을 사용해야합니까? 아니면 이것에 더 쉬운 해결책이 있습니까?

답변

1

귀하의 문제는 오버로드 확인이 컴파일시에 수행되는, 그래서 그 매개 변수의 정적 유형과 일치하기 때문에이 기능이

virtual void process(std::tr1::shared_ptr<Message> msg) 

항상 같은 과부하를

void filter(const std::tr1::shared_ptr<Message> msg) 

를 호출 할 것입니다.

msg이 파생 클래스를 가리키는 경우가 있더라도 상관 없습니다.

+0

그래서 ... 템플릿이 유일한 해결책입니까? – Dennis