实现第二种情况的唯一目的是,如果我想从Collidable派生而不是Object的话?如果是这样,第一种情况什么时候才是有利的,因为第二种情况提供了更大的灵活性。
这两个可碰撞对象都只有一个纯虚函数,而Object是可以在屏幕上绘制的对象的基类(在我的情况下)。
^假设我正确理解了以下代码(我不太确定TBH)
class Object
class CollidableObject : Object
class Actor : public CollidableObject
class Object
class Collidable
class Actor : public Object, public Collidable
编辑:
基于Matt/Seth
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
第一个例子是第二种情况,第二个例子是第一种情况。我想这是我在第一种情况下看到的唯一用途。
L
这将是与原始问题不同的问题,因为您的答复都没有。
在这种情况下,将对象从is-a更改为has-a关系会有区别吗?在每种情况下,要检查碰撞,一个对象必须具有一个标志来知道是否应该检查碰撞。在您的情况下,可以检查该成员是否为null,但在派生情况下,对象本身会告诉它是否可以冲突。在数组/树中,我可以使用get()方法将派生对象作为参数传递,也可以将Hitbox作为参数传递。
为了更深入,我还有另一个类-使用第二种情况
class Hitbox : public Object, public Collidable
并且Actor类将其作为成员
class Actor : public Object
{
Hitbox *box;
};
有碰撞的对象将改为具有一个命中框,我认为这准确地代表了您的帖子。但是,仍然让我感到困惑的是,当我再次查看您的示例时,是否意味着Hitbox应该改为具有Collidable成员?
class Hitbox
{
Collidable *collision;
};
是)我有的:
Actor 拥有处理碰撞的Hitbox
Hitbox应该做什么:
继承可碰撞或
具有可碰撞的成员
Actor 已经在遵守您的约定。 Hitbox应该做同样的事情吗?
最佳答案
我会做第二种情况,因为Object
和Collidable
是跨领域的关注点。如果您使用CollidableObject
路线,则可能会导致类的组合爆炸。不久之后,您就会看到CollidableTrackableClickableBlowuppableObject
。
由于Collidable
是纯虚拟的,因此在这种情况下将其用作接口(interface),因此没有很多批评反对多重继承。您只是在说明Actor实现了Collidable
接口(interface)。