1

我希望有人可以帮助我解决我正在处理的设计问题。它专门针对游戏开发领域,但我认为这确实是一个更广泛的问题,可能已经以一种公认的方式解决了。我正在使用 Python。

我有一个 GameObject 类,它保存对象的位置(和其他一般状态属性)和对我的 Engine 对象的引用,该对象保存有关整个游戏世界的信息。GameObjects 可以进一步分类:它们可以是 VisibleGameObjects、PhysicalGameObjects(可碰撞)或两者,具体形式。例如,我可以有一个不可见的边界,它是物理的,但没有可见的表示。

VisibleGameObjects 实现了一个处理绘图功能的 draw() 方法,并通过其父级的 Engine 引用来委托。物理游戏对象具有边界框,并定义处理碰撞的逻辑,还需要访问游戏对象属性(加速度、速度等)

问题是,当我想定义一个需要继承 VisibleGameObject 和 PhysicalGameObject(它们都共享一个父 GameObject)行为的具体对象时会发生什么?据我了解,这种循环继承是一个非常糟糕的主意。

我如何重构它以将特定行为基本上固定到依赖于父抽象类状态的具体子类(可绘制、可碰撞)?

编辑:我的一个想法是将它们分配给 GameObjects 的具体实例作为组件,支持 has-a 关系而不是 is-a 关系。然而,即使这样看起来也不那么干净。尝试通过在“组件”列表中搜索可碰撞组件来检查对象是否可碰撞似乎也不是很好。

4

1 回答 1

1

看起来你正在寻找一个特质

不幸的是,python 本身并不支持特征,尽管有多个 模块试图实现该模型。

我的建议(除非你想依赖于提到的模块)是编写抽象类来公开你想要的行为,但不继承主类 - 将它留给第三类,它继承了主类和行为类。

它可能与一个示例不太混淆:创建一个继承自的Visible抽象类,并公开所有预期的行为/功能(就好像它继承自)。然后,继承自和。GameObjectGameObjectVisibleGameObjectGameObjectVisible

显然,您只能设法Visible使用像 python 这样的动态语言进行编写——否则编译器会抱怨它无法访问不存在的字段。

于 2012-12-22T00:48:19.847 回答