我对如何处理我的游戏/模拟框架的类结构有疑问。请注意,我这样做主要是为了自己的乐趣,我知道已经有很多好的解决方案了 :)
除其他外,框架的结构具有Scene
包含Actor
s 的 s。Scene
s 和s都Actor
可以以许多不同的方式表现,WRT 内部工作方式的某些方面。我已经使用多重继承实现了这样的行为,如下所示:
class ActorBase : public Object { ... };
class Actor : virtual public ActorBase { ... };
class CollisionBehavior : virtual public ActorBase { ... };
class BoundingBoxCollisionBehavior : public CollisionBehavior { ... };
class MyActor : public Actor, public BoundingBoxCollisionBehavior { ... };
这样,使用虚拟继承,我可以将actor的实现与actor做什么(或它如何做)的实现分开。Actor
和类都...Behavior
需要访问公共基类来实现它们,但事物被整齐地划分,我可以通过简单地替换它继承ActorBase
的类来轻松更改对象的行为。Behavior
但这有其局限性:由于每个行为都遵循其自己的内部规则,并且一个对象可以从单个对象继承Behavior
(或者由于模棱两可的函数调用等而彻底崩溃),我永远不能让两个具有不同行为的参与者相互交互. 另外,由于我将 V8 Javascript 引擎集成到框架中,我必须为Actor
(or Scene
) 的每个可能组合及其可能的行为创建包装的子类,并以混合方式从 JS 实例化这些对象会导致再次崩溃,因为两个行为不同的对象不能相互交互(至少不是所有的东西)。
我认为另一种解决方案是放弃这种多重继承结构,转而采用这样的方式:需要Behavior
s 的每个对象都有许多数组,每个Behavior
组一个数组(如碰撞行为、移动行为等),带有一个...Behavior
每个可能的行为的对象。我可以给一个对象一个默认行为,如果需要它(与具有不同默认行为的对象发生交互),我可以将这种行为添加到一个(或两个)对象,以便它们可以相互交互 - 那里需要某种转换策略,但这不是问题。这意味着有一个循环引用(对象实例引用行为实例,行为实例引用它包含的对象),以便行为能够访问它需要做自己的事情的基本属性。子类Behavior
也需要friend
与Actor
类,以访问受保护和/或私有成员。我不是很喜欢这条路,我认为可能有一种更优雅的方法来解决这个问题,我只是还没有想到一个。
想法?:)
额外问题:我应该拼写 Behavior 还是 BehavioUr?不是母语人士!
编辑:解决了奖金问题-取决于或您在互联网上的感觉!:)
编辑 2:为清楚起见,从更改Behavior
为CollisionBehavior
(请参阅下面的答案)