7

实现第二种情况的唯一要点是如果我想从 Collidable 派生而不是 Object?如果是这种情况,那么第一种情况何时是有利的,因为第二种情况提供了更大的灵活性。

两个可碰撞对象都只有一个纯虚函数,而 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

第一个例子是第二种情况,第二个例子是第一种情况。我想这是我在第一种情况下看到的唯一用途。

@Luchian
这将是一个与原始问题不同的问题,因为您的回答都不是。

在这种情况下,将对象从 is-a 更改为 has-a 关系是否有区别?在每种情况下,为了检查碰撞,一个对象必须有一个标志来知道是否应该检查碰撞。在您的情况下,可以检查成员是否为空,但在派生情况下,对象本身会告诉它是否可以碰撞。在数组/树中,我可以将派生对象作为参数传递,也可以使用 get() 方法将 hitbox 作为参数传递。

为了更深入,我还有另一门课——使用第二种情况

class Hitbox : public Object, public Collidable

并且 Actor 类将其作为成员

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

有碰撞的物体会有一个碰撞箱,我认为这准确地代表了你的帖子。但是仍然让我感到困惑的是,当我再次查看您的示例时,这是否意味着 Hitbox 应该有一个 Collidable 成员?

class Hitbox
{
     Collidable *collision;
};

我所拥有的:
Actor 拥有一个处理碰撞的 Hitbox

Hitbox 应该做什么:
继承 Collidable 或
将 Collidable 作为成员

演员已经在遵循你的约定。Hitbox 也应该这样做吗?

4

3 回答 3

2

我会做第二种情况,就像Object横切Collidable关注点一样。如果你走这CollidableObject条路,你最终可能会遇到类的组合爆炸。很快你就会看到一个CollidableTrackableClickableBlowuppableObject

由于Collidable是纯虚拟的,在这种情况下它被用作接口,因此没有很多反对多重继承的批评。您只是在声明一个 Actor 实现了Collidable接口。

于 2012-07-17T21:10:18.903 回答
1

这是策略模式的完美场景。这就是英语在我们脑海中戏弄的地方,让我们认为这CollidableObject是这个层次结构中的一个有效对象。我说碰撞更像是一种行为而不是物体,所以我不会选择两者。

首选组合:

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

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

实现第二种情况的唯一要点是如果我想从 Collidable 派生而不是 Object?

是的,第二种情况为您提供了更大的灵活性,因为它允许分离接口。例如,稍后您可能想要一个可碰撞但不可绘制的对象。

自从第 2 种情况提供更大的灵活性以来,第一种情况何时是有利的。

第二种情况提供了更大的灵活性,但设计起来也更复杂。最后,您将需要虚拟继承,这更难处理。但是,如果您的基类是纯抽象的,那应该不是问题。

你可能会看到这个

于 2012-07-17T22:05:24.713 回答