[英]C++ Multiple Inheritance Design Issue
我對如何進行游戲/模擬框架的類結構有疑問。 請注意,我這樣做主要是出於我自己的享受,我知道已經有很多好的解決方案了:)
框架的結構除其他外具有包含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是什么的實現與actor所做的事情(或其實現方式)的實現分開。 Actor
和...Behavior
類都需要訪問公共基類ActorBase
來實現,但是事情被巧妙地分隔開了,我可以通過簡單地替換其繼承的Behavior
類來輕松更改對象的Behavior
。
但是,這有其局限性:由於每個行為都遵循其自己的內部規則,並且一個對象可以從單個Behavior
繼承(否則地獄會由於函數調用不明確等原因而松散),所以我永遠不會有兩個行為不同的參與者相互影響其他。 另外,由於我將V8 Javascript Engine集成到框架中,因此我必須為Actor
(或Scene
)及其可能的行為的每種可能的組合創建包裝的子類,並以混合方式從JS實例化這些對象,導致崩潰,因為同樣,行為不同的兩個對象不能互相交互(至少不是所有對象都不能交互)。
我想到的另一種解決方案是放棄這種多重繼承結構,而采用類似這樣的方法:每個需要Behavior
的對象都有許多數組,每個Behavior
組具有一個數組(如碰撞行為,運動行為等),並帶有...Behavior
對象的每種可能的行為。 我可以為對象提供默認行為,如果需要的話(與具有不同默認行為的對象發生交互),我可以將這種行為添加到一個(或兩個)對象中,以便它們可以彼此交互。需要某種轉換政策,但這不是問題。 這意味着要擁有一個循環引用(對象實例引用行為實例,行為實例引用其所包含的對象),以便該行為能夠訪問其做自己的事情所需的基本屬性。 Behavior
子類還需要與Actor
類成為friend
,以訪問受保護的成員和/或私有成員。 我不太喜歡這條路,並且我認為可能有一種更優雅的方式來解決此問題,我只是還沒有想到。
有什么想法嗎? :)
獎勵問題:我應該拼寫“行為”還是“行為”? 不是母語!
編輯:解決了獎金問題-取決於或您在Internet上的感覺! :)
編輯2:為清楚起見,從“ Behavior
更改為CollisionBehavior
(請參閱下面的答案)
恐怕您在這里混混東西。 如您所述,有許多不同種類的行為1 :
當然,將WalkingBehavior
與FightingBehavior
進行比較是沒有意義的,因此讓它們共享基類也沒有任何意義。
因此,我認為您應該只使用Actors並提供檢索這些行為的方法:
class Actor {
public:
virtual WalkingBehavior const& walkingBehavior() const {
return DefaultWalkingBehavior;
}
virtual FightingBehavior const& fightingBehavior() const {
return DefaultFightingBehavior;
}
// ...
}; // class Actor
默認行為的定義方式是,它可以與類的更常規行為進行交互。 然后,每個特定的接口(例如FightingBehavior
都應提供必要的方法來理解此行為。
請注意,這種編碼信息的方法非常通用:您可以混合在編譯時確定的行為和在運行時確定的行為(並且可能在運行時演變),而不會對客戶端造成任何影響。
1就我個人而言,我只是遵循內置的瀏覽器拼寫檢查器。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.