簡體   English   中英

C ++多重繼承設計問題

[英]C++ Multiple Inheritance Design Issue

我對如何進行游戲/模擬框架的類結構有疑問。 請注意,我這樣做主要是出於我自己的享受,我知道已經有很多好的解決方案了:)

框架的結構除其他外具有包含ActorScene SceneActor都可以以多種不同的方式表現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

  • 步行行為
  • 說話行為
  • 戰斗行為
  • ...

當然,將WalkingBehaviorFightingBehavior進行比較是沒有意義的,因此讓它們共享基類也沒有任何意義。

因此,我認為您應該只使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM