2012-07-17 94 views
7

实现第二种情况唯一的一点是如果我想从一个Collidable派生而不是一个对象?如果是这样的话,第一起案件何时有利,因为第二起案件提供了更大的灵活性。哪种类型的继承更可取?

两个collidables只有一个纯虚函数,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关系的区别?在每种情况下,为了检查碰撞,对象必须有一个标志来知道是否应该检查碰撞。在你的情况下,成员可以检查它是否为null,但在派生的情况下,对象本身告诉它是否可以碰撞。在数组/树中,我可以将派生对象作为参数传递,或者使用get()方法将hitbox作为参数传递。

更深入,我有另一个类 - 使用所述第二壳体

class Hitbox : public Object, public Collidable 

和Actor类具有它作为一个部件,其有碰撞将具有击中格

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

对象相反,这代表你的职位准确,我认为。但是,我仍然感到,当我再次查看你的例子时,这是否意味着Hitbox应该有一个Collidable成员呢?

class Hitbox 
{ 
    Collidable *collision; 
}; 

我有什么:
一个演员拥有它处理冲突

击中格应该做的一击中格:
继承可碰撞或
有无可碰撞的成员

演员已经下你的约定。 Hitbox应该这样做吗?

回答

2

我会做第二种情况,因为ObjectCollidable是交叉问题。如果你走CollidableObject路线,你可能会最终导致类的组合爆炸。直到你看到一个CollidableTrackableClickableBlowuppableObject不会很长。

因为Collidable是纯虚拟的,所以在这种情况下它被用作接口,所以没有很多针对多重继承的批评。你只是简单地指出一个Actor实现了接口Collidable

+0

如果你是第一次做的话,你不必拥有一个“CollidableTrackableClickableBlowuppableObject”。它只是一个继承自Collidable,Trackable,Clickable和Blowuppable的类,就像第一种方式一样,但是你不会像第一种方式那样继承Object。我不确定第一个是否更有用;不应该所有的'Clickable's都可以绘制到屏幕上吗?如果你把它们全部分开,你不能分辨出你的Object是可点击的还是你的Clickable是可绘制的。第二种方法,你知道'Clickable'是可绘制的。 – 2012-07-17 21:14:26

+1

如果你做了_second_我想说的话,你就不必有...了。 – 2012-07-17 21:42:13

1

这是strategy pattern的完美场景。这就是英语在我们脑海中玩弄技巧的地方,并且让我们认为CollidableObject是这个层级中的有效对象。我认为碰撞更多的是一种行为而不是一种物体,所以我会选择两种都不行。

宗教组成。用于该:

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

class AClassThatDoesntCollide 
{ 
    // collisionBehavior = NULL 
} 
+0

如果碰撞行为取决于Actor类的细节,这将不太实际。另一方面,如果它是一个独立的属性,这是很有道理的。 – 2012-07-17 22:04:40

0

是落实第二个情况下,唯一一点,如果我想获得从可碰撞 而不对象?

是的,第二种情况给你更多的灵活性,因为它允许分开接口。例如,稍后您可能需要一个可碰撞的对象,但它不可绘制。

什么时候有利于第一种情况,因为第二种情况提供更多的 灵活性。

第二种情况提供了更多的灵活性,但设计也更复杂。最后,你将需要虚拟继承,这是更难处理。但是,如果您的基类是纯粹的抽象类型,它不应该是一个问题。您可能会看到this