내 게임/시뮬레이션 프레임 워크의 클래스 구조와 관련하여 진행 방법에 의문이 있습니다. 나는 주로 내 자신의 즐거움을 위해이 일을하고 있습니다, 이미 거기에 좋은 솔루션을 많이 :)이 알고C++ 다중 상속 디자인 문제
프레임 워크의 구조가 다른 것들 Actor
들 포함, Scene
의 사이. Scene
과 Actor
은 모두 여러 가지 방식으로 작동 할 수 있습니다. WRT는 물건이 내부적으로 어떻게 작동 하는지를 나타냅니다. 그래서 같은 다중 상속을 사용하는 등의 행동을 구현 한 :
class ActorBase : public Object { ... };
class Actor : virtual public ActorBase { ... };
class CollisionBehavior : virtual public ActorBase { ... };
class BoundingBoxCollisionBehavior : public CollisionBehavior { ... };
class MyActor : public Actor, public BoundingBoxCollisionBehavior { ... };
이 방법은, 가상 상속을 사용하여, 나는 배우의 구현에서 무엇의 구현을 분리 할 수있는 배우가 무엇을 (또는 그것을 수행하는 방법). Actor
과 ...Behavior
클래스 모두 구현을 위해 공통 기본 클래스 ActorBase
에 액세스해야하지만 일들은 깔끔하게 구분되어 있으므로 Behavior
클래스를 상속받은 클래스로 바꾸기 만하면 쉽게 객체의 동작을 변경할 수 있습니다.
이것은 각 동작이 자체 내부 규칙을 따르고 객체가 하나의 Behavior
에서 상속받을 수 있기 때문에 (또는 모호한 함수 호출 등으로 인해 느슨한 부분이 깨지기 때문에) 서로 다른 두 개의 액터를 가질 수 없습니다. 행동은 서로 상호 작용합니다. 또한 V8 Javascript Engine을 프레임 워크에 통합 할 때 Actor
(또는 Scene
) 및 가능한 동작의 가능한 조합마다 래핑 된 하위 클래스를 만들어 JS에서 혼합 된 방식으로 이러한 개체를 인스턴스화해야합니다. 다시 말해, 다르게 동작하는 두 객체가 서로 상호 작용할 수 없기 때문에 충돌이 발생합니다 (적어도 모든 것에 해당하지는 않음).
나는이 같은 다중 상속 구조를 버려야한다고 생각하는 대안의 해결책 : Behavior
을 필요로하는 각 객체는 각각 Behavior
그룹 (충돌 동작, 동작 동작 등)에 대해 하나씩 많은 배열을 가지고 있습니다. 각 가능한 동작에 대해 ...Behavior
개체를 사용하십시오. 객체에 기본 비헤이비어를 제공 할 수 있으며 필요할 때마다 (기본 비헤이비어가 다른 객체와 상호 작용이 발생 함) 하나의 객체에 이러한 비헤이비어를 추가하여 서로 상호 작용할 수 있습니다. 일종의 전환 정책이되어야하지만 문제는 아닙니다. 이는 순환 참조를 갖는 것을 의미합니다 (객체 인스턴스는 비헤이비어 인스턴스를 참조하고 비헤이비어 인스턴스는 비헤이비어 인스턴스에 포함 된 객체를 참조합니다). 비헤이비어는 고유 한 작업을 수행하는 데 필요한 기본 속성에 액세스 할 수 있습니다. Behavior
하위 클래스는 Actor
클래스의 friend
s이어야하며 보호 된 멤버 및/또는 비공개 멤버에 액세스해야합니다. 나는이 길을 그다지 좋아하지 않는다. 나는이 문제를 해결하는보다 우아한 방법이있을 것이라고 생각한다. 아직 생각하지 못했다.
생각하십니까? :)
보너스 질문 : 행동이나 행동을 철자해야합니까? 네이티브 스피커가 아닙니다!
편집 : 보너스 질문을 해결했습니다 - 인터넷에 의존하고있는 위치에 따라 다릅니다. :)
편집 2 : 명확성을 위해 CollisionBehavior
에 Behavior
에서 변경 (아래 답변을 참조)
원어민이 아니지만 * 행동 *은 미국의 철자이지만 * 행동 *은 영국입니다 (또는 이미 들었습니다). 로마에있을 때, 로마인처럼 행동하십시오. – jrok
배우들은 * 행동이 아닙니다 ** 상속 관계에 있습니다. 나는 내 행동을 구축하고 그들을 적절하게 내줄 것이다. – ChiefTwoPencils
"Behavior"는 영어 철자입니다. "행동"은 미국에서 표준화 된 맞춤법 오류입니다. –