0

는 내가이"이중 다형성": 이중 발송 패턴 또는 방문자 패턴 만?

class BC_TOYFD 
{ 
    public: 
     BC_TOYFD(BS_TOYFD * pBS, BC2 dBC2); 
     virtual ~BC_TOYFD(void) ; 
     BS_TOYFD * _pBS ; 
     BC2 _dBC2 ; 
     double _PDA ; // store price down approximation 
     double _PUA ; // store price up approximation 
     virtual void COMPUTEBVDOWNFOR(PAYOFF_TOYFD * pPAYOFF, double * attime) = 0 ; 
     virtual void COMPUTEBVUPFOR(PAYOFF_TOYFD * pPAYOFF, double * attime) = 0  ; 
}; 

이로부터

class DIRICHLET_TOYFD : public BC_TOYFD 
{ 
    public: 
     DIRICHLET_TOYFD(BS_TOYFD * pBS, BC2 dBC2) ; 
     ~DIRICHLET_TOYFD(void) ; 
     void COMPUTEBVDOWNFOR(PAYOFF_TOYFD * pPAYOFF, double * attime) ; 
     void COMPUTEBVUPFOR(PAYOFF_TOYFD * pPAYOFF, double * attime) ; 
}; 

파생하고 난

void DIRICHLET_TOYFD::COMPUTEBVDOWNFOR(PAYOFF_TOYFD * pPAYOFF, double * attime) 

void DIRICHLET_TOYFD::COMPUTEBVUPFOR(PAYOFF_TOYFD * pPAYOFF, double * attime) 

는 것을 따라 할 수있는 방법을 싶습니다 만민 pPAYOFF의 실행시의 형태로, 그러나

void DIRICHLET_TOYFD::COMPUTEBVDOWNFOR(PAYOFF_TOYFD * pPAYOFF, double * attime) 

_PUA = something if the runtime type of pPAYOFF (which is an abstract class) is for instance CALL_TOYFD 

_PUA = something else if the runtime type of pPAYOFF (which is an abstract class) is for instance PUT_TOYFD 

CALL_TOYFD처럼 뭔가를 할 것이다, 일반적으로

dynamic_cast<> 

에 의존하지 않고 및 PUT_TOYFD는 pu입니다. PAYOFF_TOYFD에서 파생 된 blic. 그리고 이후, 나는 기원전 BC_TOYFD의 인스턴스이며, pPAYOFF가 PAYOFF_TOYFD에 대한 포인터이고, BC와 pPAYOFF에 적합한 유형이 런타임에 해결되도록

double approx = bc->COMPUTEBVDOWNFOR(pPAYOFF, attime) ; 

같은 것을 쓸 수 있도록하고 싶습니다 .

다른 힌트/정밀도없이 "이중 발송"또는 "역 이중 발송"패턴을 사용한다고 들었습니다. 필자는이 작업을 정확하게 수행하는 방법을 모른 채이 프레임 워크에서 구현하려고했습니다. 그건 그렇고, 나는 BC_TOYFD에서 파생 된 DIRICHLET_TOYFD와 같은 "다른"수업을 갖게 될 것입니다. 제가 해결하려고 노력하는 것과 동일한 문제를 해결해야 할 것입니다. 그래서 저는 이중 파견이 제 경우에 실제로 적용될 것입니다. 이 제약 조건을 고려해야합니다.

도움이 될 것입니다.

고맙습니다.

답변

0

좋아요, 관련 패턴을 전혀 모르고 있음을 깨닫고 조금 배우고 나면 마침내 파견 패턴을 이해했으며 방문자 패턴은 실제로 이중 디스패치 패턴이었습니다. 나는 그것이

을 할 기대

// fwd decls 

class BOUNDARY_CONDITION_DIRICHLET ; 
class BOUNDARY_CONDITION_NEUMANN ; 

class PAYOFF 
{ 
    public: 
     virtual void on_call(BOUNDARY_CONDITION_DIRICHLET * pBOUNDARY_CONDITION_DIRICHLET) = 0 ; 
     virtual void on_call(BOUNDARY_CONDITION_NEUMANN * pBOUNDARY_CONDITION_NEUMANN) = 0 ; 
}; 

//////////////////////////////////////////////////////// 

class BOUNDARY_CONDITION_DIRICHLET : public BOUNDARY_CONDITION 
{ 
public: 
    void COMPUTE_APPROX(PAYOFF * pPAYOFF) 
    { 
     pPAYOFF->on_call(this) ; 
    } 
    void on_visit(CALL * pCALL) 
    { 
     std::cout << "The code \"BOUNDARY_CONDITION_DIRICHLET->f(CALL);\" has been executed" << std::endl ; 
    } 
    void on_visit(PUT * pPUT) 
    { 
     std::cout << "The code \"BOUNDARY_CONDITION_DIRICHLET->f(PUT);\" has been executed" << std::endl ; 
    } 
}; 

//////////////////////////////////////////////////////// 

class BOUNDARY_CONDITION_NEUMANN : public BOUNDARY_CONDITION 
{ 
    public: 
     void COMPUTE_APPROX(PAYOFF * pPAYOFF) 
     { 
      pPAYOFF->on_call(this) ; 
     } 
     void on_visit(CALL * pCALL) 
     { 
      std::cout << "The code \"BOUNDARY_CONDITION_NEUMANN->f(CALL);\" has been executed" << std::endl ; 
     } 
     void on_visit(PUT * pPUT) 
     { 
      std::cout << "The code \"BOUNDARY_CONDITION_NEUMANN->f(PUT);\" has been executed" << std::endl ; 
     } 
}; 

//////////////////////////////////////////////////////// 

class CALL : public PAYOFF 
{ 
    public: 
     void on_call (BOUNDARY_CONDITION_DIRICHLET * pBOUNDARY_CONDITION_DIRICHLET) 
     { 
      pBOUNDARY_CONDITION_DIRICHLET->on_visit(this) ; 
     } 
     void on_call(BOUNDARY_CONDITION_NEUMANN * pBOUNDARY_CONDITION_NEUMANN) 
     { 
      pBOUNDARY_CONDITION_NEUMANN->on_visit(this) ; 
     } 
}; 

//////////////////////////////////////////////////////// 

class PUT : public PAYOFF 
{ 
    public: 
     void on_call (BOUNDARY_CONDITION_DIRICHLET * pBOUNDARY_CONDITION_DIRICHLET) 
     { 
      pBOUNDARY_CONDITION_DIRICHLET->on_visit(this) ; 
     } 
     void on_call(BOUNDARY_CONDITION_NEUMANN * pBOUNDARY_CONDITION_NEUMANN) 
     { 
      pBOUNDARY_CONDITION_NEUMANN->on_visit(this) ; 
     } 
}; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    BOUNDARY_CONDITION_DIRICHLET dBOUNDARY_CONDITION_DIRICHLET ; 
    BOUNDARY_CONDITION_NEUMANN dBOUNDARY_CONDITION_NEUMANN ; 
    CALL dCALL ; 
    PUT dPUT ; 
    BOUNDARY_CONDITION_DIRICHLET * pBOUNDARY_CONDITION_DIRICHLET = &dBOUNDARY_CONDITION_DIRICHLET ; 
    BOUNDARY_CONDITION_NEUMANN * pBOUNDARY_CONDITION_NEUMANN = &dBOUNDARY_CONDITION_NEUMANN ; 
    CALL * pCALL = &dCALL ; 
    PUT * pPUT = &dPUT ; 

    BOUNDARY_CONDITION * pBOUNDARY_CONDITION = pBOUNDARY_CONDITION_DIRICHLET ; 
    PAYOFF * pPAYOFF = pCALL ; 
    pBOUNDARY_CONDITION->COMPUTE_APPROX(pPAYOFF) ; 

    pBOUNDARY_CONDITION = pBOUNDARY_CONDITION_DIRICHLET ; 
    pPAYOFF = pPUT ; 
    pBOUNDARY_CONDITION->COMPUTE_APPROX(pPAYOFF) ; 

    pBOUNDARY_CONDITION = pBOUNDARY_CONDITION_NEUMANN ; 
    pPAYOFF = pCALL ; 
    pBOUNDARY_CONDITION->COMPUTE_APPROX(pPAYOFF) ; 

    pBOUNDARY_CONDITION = pBOUNDARY_CONDITION_NEUMANN ; 
    pPAYOFF = pPUT ; 
    pBOUNDARY_CONDITION->COMPUTE_APPROX(pPAYOFF) ; 

    system("pause") ; 
    return 0; 
} 

실제로 일 : ;-) 내가 제시 한 코드 조각에 관하여, 여기에 솔루션입니다