GoF 저작 에서 언급 되 지 않 은 디자인 모델 (4): Double Dispatch
11224 단어 Dispatch
class Event
{
public:
virtual void PrintName()
{
cout<<" "<<endl;
}
}
class KeyEvent:public Event
{
public:
virtual void PrintName()
{
cout<<" "<<endl;
}
}
class ClickEvent:public Event
{
public:
virtual void PrintName()
{
cout<<" "<<endl;
}
}
다 태 성 은 동태 적 이 고 호출 된 방법 은 대상 의 진정한 유형 에 의 해 확정 되 며 이 과정 을 dispatch 라 고 부른다.예 를 들 어 C + + 에서 모든 대상 에 가상 함수 표 가 있 습 니 다. 기본 클래스 의 유형 으로 하위 클래스 대상 을 참조 할 때 가상 함수 포인터 가 가리 키 는 것 은 하위 클래스 의 가상 함수 표 입 니 다. 호출 된 가상 함 수 는 모두 하위 클래스 의 버 전 입 니 다. 그래서 다음 코드 는 '나 는 버튼 이벤트' 입 니 다. 이것 은 dispatch 의 과정 이 라 고 할 수 있 습 니 다.즉, 대상 유형 에 따라 어떤 함 수 를 호출 하 는 과정 을 동적 으로 확정 하 는 것 이다.
Event* pEvent = new KeyEvent();
pEvent->PrintName();
dispatch 는 언제 두 번 사용 하나 요?계속 내 려 다 보기:
class EventRecorder
{
public:
virtual void RecordEvent(Event* event)
{
cout<<" EventRecorder "<< endl;
}
virtual void RecordEvent(KeyEvent* event)
{
cout<<" EventRecorder "<< endl;
}
virtual void RecordEvent(ClickEvent* event)
{
cout<<" EventRecorder "<< endl;
}
}
class AdvanceEventRecorder:public EventRecorder
{
public:
virtual void RecordEvent(Event* event)
{
cout<<" EventRecorder "<< endl;
}
virtual void RecordEvent(KeyEvent* event)
{
cout<<" EventRecorder "<< endl;
}
virtual void RecordEvent(ClickEvent* event)
{
cout<<" EventRecorder "<< endl;
}
}
이 두 가지 유형 에는 각각 세 개의 리 셋 함수 가 포함 되 어 있 습 니 다. 다 중 태 는 동적 이 고 함수 리 셋 은 정적 입 니 다. 컴 파일 시기 에 확정 되 었 기 때문에 아래 코드 세 션 의 운행 결 과 는 우리 가 기대 하 는 것 이 아 닙 니 다.
EventRecorder* pRecorder = new AdvanceEventRecorder();
Event* pEvent = new KeyEvent();
pRecorder->RecordEvent(pEvent);
출력 내용: 고급 EventRecorder 를 사용 하여 일반적인 이 벤트 를 기록 합 니 다.
실제로 이 장면 에서 우리 가 원 하 는 것 은 AdvanceEventRecorder:: RecordEvent (KeyEvent * event) 이다.
다음은 Double Dispatch 디자인 모델 을 사용 하여 위의 코드 세 션 의 목적 을 달성 하고 모든 이벤트 대상 에 아래 의 함 수 를 추가 합 니 다.
virtual void RecordEvent(EventRecorder* recorder)
{
recorder->RecordEvent(this);
}
다음 코드 세 션 을 출력 합 니 다: 고급 EventRecorder 를 사용 하여 버튼 이 벤트 를 기록 합 니 다.
EventRecorder* pRecorder = new AdvanceEventRecorder();
Event* pEvent = new KeyEvent();
pEvent->RecordEvent(pRecorder);
1 차 dispatch 는 KeyEvent 의 RecordEvent (EventRecorder * recorder) 를 정확하게 찾 았 고, 2 차 dispatch 는 AdvanceEventRecorder 의 RecordEvent (KeyEvent * event) 를 찾 았 음 을 알 수 있다. Visitor 모드 는 Double Dispatch 에 대한 응용 이 며 충돌 검출 알고리즘 에서 도 자주 사용 된다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Reducing Dynamic Dispatch지난 포스트에서 소개했던 final 키워드는 Reducing Dynamic Dispatch 중 한가지 방법이라고 말씀드렸었는데요, 이번 포스트에서는 Dynamic Dispatch와 그 외에 다른 방법에 대해 알아보려...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.