2016-04-03 11 views
1

私は現在、b2Bodyへのポインタといくつかのメソッドと変数を含む 'WorldObject'クラスを持っています。b2Bodyオブジェクトまたはb2Bodyオブジェクトを含むクラスの派生クラスですか?

WorldObjectをb2Bodyの派生クラスにするのは賢明ではありませんか?

このようなことに対する一般的なアプローチは何ですか?クラス内で最も重要なオブジェクトの派生クラスを常に作成するか、または新しいクラスを作成してすべての属性を作成するだけですか?

これらの可能性の賛否両論は何ですか?

ありがとうございます。

答えて

2

構図を行うには、通常は優れていると継承を使いすぎないように。

通常、b2World::CreateBody()を呼び出す本体を作成し、b2Body*を返し、継承が不可能であることにも注意してください。あなたはスマートポインタを使用することができ、内側b2Body*の寿命の問題を回避するには

。私は、この定義を使用します。

class BodyDeleter 
{ 
public: 
    BodyDeleter() 
     :m_world(NULL) 
    {} 
    BodyDeleter(b2World *world) 
     :m_world(world) 
    {} 
    void operator()(b2Body *body) 
    { 
     if (m_world) 
      m_world->DestroyBody(body); 
    } 
private: 
    b2World *m_world; 
}; 

typedef std::unique_ptr<b2Body, BodyDeleter> b2BodyPtr; 

その後、私のWorldObjectに:

class WorldObject 
{ 
protected: 
    WorldObject(b2World *world) 
    :m_body(NULL, m_world) 
    {} 
    b2BodyPtr m_body; 
}; 

そして、WorldObjectの実際のサブクラスで:

class SpaceShip : public WorldObject 
{ 
public: 
    SpaceShip(b2World *world) 
    :WorldObject(world) 
    { 
     //initialize bodydef and whatever 
     m_body.reset(world->CreateBody(...)); 
    } 
}; 
3

最善の方法はありません。これは、すべてのコンテキストに依存:

  • b2Bodyへのポインタを有する組成関係、すなわちWorldObjectb2Bodyを有するを実現します。 WorldObjectを作る

  • b2Body implemetnsの継承から派生し、WorldObjectb2Bodyある場合にのみ行われるものとします。これは、原則としてWorldObjectオブジェクトで、できることはすべてb2Boby(以上)で行うことができることを意味します。

preferring composition over inheritanceの経験則があります。あなたに本当に明らかな継承がない限り。

あなたのケースでは、b2Bodyはリジッドボディです。今あなたのための質問:あなたのオブジェクトは体ですか?またはあなたのオブジェクトは体ですか?

もっと実用的:このデザインの利点は、WorldObjectにBox2Dエンジンの選択肢をカプセル化していることです。これにより、後で別のAPIを使用してソフトウェアを別の物理エンジンに移植する場合に、より効果をコントロールできます。代わりに継承を使用する場合は、基礎となるエンジンAPIが独自のソフトウェアの設計に大きな影響を与え、ある日に別のエンジンに移行することを非常に困難にします。

0

あなたは、相続以上の組成を好む必要があります。組成はfragile base class problemを避ける。メソッド呼び出しとは異なり

  • 、継承は

  • サブクラスは特に、サブクラスの破線機能変更することができ、それらのスーパークラス、上に結果として

  • 使用組成物および転送の代わりに継承依存カプセル化に違反ラッパークラスを実装するための適切なインタフェースが存在するかどうかを判定します。

  • クラスを継承

のために設計されている場合、私はあなたが

ジョシュアブロッホによって「効果的なJavaの」書籍の「継承の上に好意組成物」の項目16を読むことをお勧め
  • 使用の継承

  • 関連する問題