7

2 番目のケースを実装する唯一のポイントは、オブジェクトにならずに Collidable から派生させたい場合ですか? その場合、2 番目のケースの方が柔軟性が高いため、1 番目のケースが有利になるのはいつですか。

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

^次のコードを正しく理解していると仮定します (よくわかりません TBH)

class Object
class CollidableObject : Object
class Actor : public CollidableObject

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

編集:

マット/セスに基づく

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

最初の例は 2 番目のケースで、2 番目の例は最初のケースです。それが最初のケースで私が目にする唯一の用途だと思います。

@Luchian
あなたの返信はどちらでもないので、これは元の質問とは別の質問になります。

この場合、オブジェクトを 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 を保持しています

Hitbox のすべきこと:
Collidable を継承するか
、メンバーとして Collidable を持っている

アクターはすでにあなたの規則に従っています。ヒットボックスも同じことをすべきですか?

4

3 に答える 3

2

ObjectCollidableは分野横断的な懸念事項であるため、私は 2 番目のケースを行います。ルートに行くCollidableObjectと、おそらくクラスの組み合わせ爆発に終わるでしょう。が表示されるまで、そう長くはかかりませんCollidableTrackableClickableBlowuppableObject

は純粋な仮想であるためCollidable、この場合はインターフェイスとして使用されるため、多重継承に反対する多くの批判はありません。Collidableアクターがインターフェースを実装していると言っているだけです。

于 2012-07-17T21:10:18.903 に答える
1

これは、戦略パターンに最適なシナリオです。これは、英語が私たちの心に悪戯をし、それCollidableObjectがこの階層にある有効なオブジェクトであると私たちに思わせる場所です。衝突はオブジェクトというよりも振る舞いであると私は言うので、私は2つのどちらにも行きません。

このための構成を優先します:

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

class AClassThatDoesntCollide
{
   // collisionBehavior = NULL
}
于 2012-07-17T21:42:22.397 に答える
0

2 番目のケースを実装する唯一のポイントは、オブジェクトにならずに Collidable から派生させたい場合ですか?

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

2 番目のケースの方が柔軟性が高いため、1 番目のケースが有利な場合はいつですか。

2 番目のケースは柔軟性が高くなりますが、設計がより複雑になります。最後に、仮想継承が必要になりますが、これは処理がより困難です。ただし、基本クラスが純粋な抽象である場合、問題にはなりません。

これが表示される場合があります。

于 2012-07-17T22:05:24.713 に答える