抽象行为取决于相同的基础?

时间:2012-12-22 00:25:21

标签: python oop game-engine object-oriented-analysis

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

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

VisibleGameObjects实现了一个draw()方法,该方法处理绘图功能,通过其父代的Engine引用委托它。 PhysicalGameObjects有边界框,并定义处理冲突的逻辑,还需要访问GameObject属性(加速度,速度等)

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

我怎样才能重构这一点,基本上将特定行为强制转换为依赖于父抽象类状态的具体子类(drawable,collidable)?

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

1 个答案:

答案 0 :(得分:1)

好像你正在寻找trait

不幸的是,虽然有multiple modules尝试实现模型,但python本身并不支持特征。

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

一个例子可能不那么令人困惑: 创建一个Visible抽象类,使继承自GameObject,并公开所有预期的行为/函数(就好像它继承自{{ 1}})。然后,让GameObject继承VisibleGameObjectGameObject

显然,你只能在像python这样的动态语言上编写Visible - 否则编译器会抱怨它无法访问不存在的字段。