아니요, 표준 패턴이 없습니다.
내 충고는 모든 것을위한 하나의 공통 "기본 클래스"인터페이스를 찾으려는 초보자 객체 지향 설계의 함정을 피하는 것입니다. 귀하의 드래곤은 마법사와 크게 다르며 귀여운 코드 추상화를 제외하고는 두 인터페이스를 병합하여 얻는 것이 없습니다. 코드 상속은 상속이 코드 재사용을위한 도구가 아니라는 것을 기억하십시오.
가장 간단한 방법은 각 개체가 이미 설명한대로 자체 내부 상태를 유지하고 해당 상태를 그릴 수있게하는 것입니다. 이것은 올드 스쿨 스위치 명세서 이 동일한 효과에 대해 다형성을 사용하는 것보다 더 명확한 곳입니다. 예 : 스위치 문은 거의 정확하게 다형성 메서드 호출이 수행 될지 때문에
class Dragon {
enum State { asleep, flying, breathing_fire };
public:
void draw() { /* old-school switch */
switch (cur_state){
case asleep: draw_asleep();
case flying: draw_flying();
case breathing_fire: draw_breathing_fire();
}
}
private:
void draw_asleep();
void draw_flying();
void draw_breathing_fire();
};
숙련 된 C++ 개발자, (그들이해야 등) 위의 코드에서 말하다 것이다 - 런타임 파견. (또는 더 많은 암호 : 메서드 주소 표). 개인적 견해는이 특정 유형의 클래스, 즉 상태 시스템을 캡슐화하는 단일 공용 인터페이스의 경우 switch 문이 상태 시스템을 만들기 때문에 더 명확하고 유지 관리가 가능하다는 것입니다 명시 적으로 점프. 나는 이것이 이고 일반적으로 나쁜 C++ 디자인이라는 것도 분명하다고 생각합니다.
이 디자인의 마찰은 상태 시스템과 단일 공용 인터페이스 사이의 구분선으로 인해 발생합니다. 수면 용은 분명히 날으는 드래곤과 같지 않습니다. 사실 공통점이 거의 없습니다. 그러나 더 높은 수준의 디자인은 두 사람이 같은 드래곤이라고 말합니다. 이 얼마나 엉망 이냐! 각 상태에 대해 서로 다른 Dragon 객체를 만드십니까? 아니, 그것은 국가의 개념을 호출자에게 노출시킬 것이기 때문이다. 각 주마다 서로 다른 내부 도우미 객체를 만들고 그 객체에 파견합니까? 아마도,하지만 그것은 지저분 해집니다. 위의 접근 방식은 둘 사이의 타협점입니다.switch 문을 추악함을 격리시키는 것으로 생각하십시오. 공용 인터페이스는 비공개 인터페이스와 마찬가지로 깨끗합니다. switch 문에만 더러운 엉망이 들어 있습니다. 이 방법을 고려하고 다른 제안도 고려하십시오.
마지막으로, 간단한 래퍼 템플릿 또는 펑 충분합니다 당신의 마법사와 드래곤을 그릴 :
struct Draw {
template <class S>
void operator()(S& s) { s.draw(); }
};
요점은 당신이 그들 모두를 지원해서 두 개의 서로 다른 클래스를 병합 할 필요가 없다는 것입니다 동일한 논리 연산.
기존 오픈 소스 게임에서 아이디어를 훔칩니다. –
std :: map - 내부 상태 대 애니메이션 저장 및 외부 저장소의 모든 열린 형식 용. –
W55tKQbuRu28Q4xv