Nov*_*ice 7 c++ inheritance design-patterns
实现第二种情况的唯一要点是,如果我想从一个Collidable派生而不是一个对象?如果是这种情况,那么第一种情况何时有利,因为第二种情况提供了更大的灵活性.
两个collidables只有一个纯虚函数,Object是可以在屏幕上绘制的对象的基类(在我的例子中).
^假设我正确理解以下代码(我不太确定TBH)
class Object
class CollidableObject : Object
class Actor : public CollidableObject
class Object
class Collidable
class Actor : public Object, public Collidable
Run Code Online (Sandbox Code Playgroud)
编辑:
基于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
Run Code Online (Sandbox Code Playgroud)
第一个例子是第二个案例,第二个例子是第一个案例.我想这是我在第一种情况下看到的唯一用途.
@Luchian
这是一个与原文不同的问题,因为你的答复都不是.
在这种情况下,是否存在将对象从is-a更改为has-a关系的差异?在每种情况下,为了检查冲突,对象必须有一个标志来知道是否应该检查冲突.在您的情况下,可以检查成员是否为null,但在派生的情况下,对象本身会告诉它是否可以发生碰撞.在数组/树中,我可以将派生对象作为参数传递,或者使用get()方法将hitbox作为参数传递.
为了更深入,我有另一个类 - 使用第二个案例
class Hitbox : public Object, public Collidable
Run Code Online (Sandbox Code Playgroud)
而Actor类将它作为成员
class Actor : public Object
{
Hitbox *box;
};
Run Code Online (Sandbox Code Playgroud)
碰撞的对象会有一个hitbox,而这正好代表了你的帖子.但是我仍然感觉到的是,当我再次回顾你的例子时,它是否意味着Hitbox应该有一个Collidable成员呢?
class Hitbox
{
Collidable *collision;
};
Run Code Online (Sandbox Code Playgroud)
我拥有:
一个Actor拥有一个处理碰撞的Hitbox
Hitbox应该做什么:
作为成员
继承Collidable或
具有Collidable
演员已经遵循你的约定了.Hitbox应该这样做吗?
我会做第二种情况,因为Object和Collidable是跨领域的关注点。如果你走这CollidableObject条路,你最终可能会遇到类的组合爆炸。不久之后您就会看到CollidableTrackableClickableBlowuppableObject.
由于Collidable是纯虚拟的,因此在本例中它被用作接口,因此没有很多反对多重继承的批评。您只是简单地声明一个 Actor 实现了该Collidable接口。
| 归档时间: |
|
| 查看次数: |
232 次 |
| 最近记录: |