实现第二种情况的唯一要点是如果我想从 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 也应该这样做吗?