2012-07-17 8 views
7

2番目のケースを実装する唯一のポイントは、オブジェクトではなくCollidableから派生させたいのですか?そうであれば、第2のケースはより柔軟性を提供するので、第1のケースは常に好都合である。どのタイプの継承がより望ましいですか?

両方の衝突可能オブジェクトは純粋な仮想関数のみを持ち、Objectは(私の場合は)画面に描画できるオブジェクトの基本クラスです。

マットに基づいて/セス・

class Object 
class Collidable 
class Clickable 
class Trackable 
class BlowUppable 
class Actor : public Object, public Collidable, public Clickable, public Trackable, 
       public BlowUppable 

class SomeObjectThatIsTakenForGrantedThatEverythingElseIsInherited : public Actor 

まず例:

^私が正しく、次のコードを理解してると仮定

class Object 
class CollidableObject : Object 
class Actor : public CollidableObject 

class Object 
class Collidable 
class Actor : public Object, public Collidable 

編集(私はTBHあまりにもわからないんだけど)第2の場合であり、第2の例は第1の場合である。私はそれが最初のケースのために見る唯一の使用だと思います。

@ルチアン
あなたの返信がどちらでもなかったため、これは元のものとは異なる質問になります。

この場合、オブジェクトをis-a関係からhas-a関係に変更する違いはありますか?それぞれの場合において、衝突をチェックするためには、オブジェクトは、衝突がチェックされるべきかどうかを知るためのフラグを持たなければならない。あなたの場合、メンバはnullかどうかを調べることができますが、派生した場合、オブジェクト自体が衝突する可能性があるかどうかを通知します。配列/ツリーでは、get()メソッドを使用して、派生オブジェクトを引数として渡すか、またはヒットボックスを引数として渡すことができます。

深さでより多くのことには、私は別のクラスを持っている - 2番目のケースに

class Hitbox : public Object, public Collidable 

を使用し、Actorクラスはメンバーとしてそれを持って衝突を持って

class Actor : public Object 
{ 
    Hitbox *box; 
}; 

オブジェクトがヒットボックスを持っているでしょう代わりに、これはあなたの投稿を正確に表していると思います。しかし、まだ私を得ることは、あなたの例をもう一度見直すと、代わりにHitboxにCollidableメンバーが必要だということですか?

私が持っている
class Hitbox 
{ 
    Collidable *collision; 
}; 

:メンバー

俳優がすでにフォローしているよう
継承衝突可能か
持って衝突可能:俳優はヒットボックスが何をすべき衝突

を扱うヒットボックスを保持している
あなたの大会Hitboxは同じようにする必要がありますか?

答えて

2

私はObjectCollidableがクロスカッティングの問題であるため、2番目のケースを実行します。 CollidableObjectルートに行くと、おそらくクラスのコンビナトリアルな爆発で終わるでしょう。 CollidableTrackableClickableBlowuppableObjectが表示されるまで長くはありません。

Collidableは純粋な仮想なので、この場合はインターフェイスとして使用されるため、複数の継承を主張する批判はあまりありません。アクターがCollidableインターフェイスを実装しているということだけです。

+0

最初に「CollidableTrackableClickableBlowuppableObject」を設定する必要はありません。最初の方法と同様に、 'Collidable'、' Trackable'、 'Clickable'、' Blowuppable'から継承したクラスですが、最初のように 'Object'を継承しません。私は最初のものがより有用であるかどうか分からない。すべての「Clickable」が画面に描画可能であるべきではないか?それらをすべて別々にすると、 'Object'がクリック可能かどうか、あるいは' Clickable'がドロウアブルかどうかは分かりません。 2番目の方法では、「Clickable」はドロウアブルであることがわかります。 –

+1

あなたは私が言っていた_second_をしたら、あなたは...持っている必要はありません。 –

1

これはstrategy patternの完璧なシナリオです。これは英語の言葉が私たちの心に賭けるところであり、CollidableObjectがこの階層にある有効なオブジェクトだと思うようになっています。私は、衝突は物体よりも行動のほうが多いと言います。そのため、私はどちらも一緒にいないでしょう。

は、このための組成物を好む:

class Object 
{ 
    CollidableBehavior* collisionBehavior; 
} 
class Actor : Object 
{ 
    // collisionBehavior = new ActorCollision() 
} 

class AClassThatDoesntCollide 
{ 
    // collisionBehavior = NULL 
} 
+0

衝突の動作がActorクラスの仕様に依存する場合、これはあまり実用的ではありません。一方、それが独立した属性であれば、これは理にかなっています。 –

0

は、私は、オブジェクトされずに衝突可能と を導出したい場合は第二のケースを実装する際の唯一のポイントはありますか?

はい、2番目のケースでは、インターフェイスを分離できるので、柔軟性が増します。たとえば、後でオブジェクトが衝突可能であるが、描画可能でないオブジェクトが必要な場合があります。

2番目のケースがより柔軟な場合は、 より多くのケースが優先されます。

第2のケースでは、柔軟性が向上しますが、設計がより複雑になります。結局、仮想継承が必要になります。これは処理が難しくなります。しかし、基底クラスが純粋な抽象クラスである場合、それは問題ではありません。

thisが表示されます。

関連する問題