我希望有人可以帮我解决我正在处理的设计问题。它特别是在游戏开发领域,但我认为它确实是一个更广泛的问题,可能已经以一种公认的方式解决了。我在Python工作。
我有一个GameObject类,它保存对象的位置(和其他常规状态属性)以及对我的Engine对象的引用,该对象保存有关游戏世界的信息。 GameObjects可以进一步分类:它们可以是具体形式的VisibleGameObjects,PhysicalGameObjects(可碰撞)或两者。例如,我可以有一个不可见的边界,它是物理的,但没有可见的表示。
VisibleGameObjects实现了一个draw()方法,该方法处理绘图功能,通过其父代的Engine引用委托它。 PhysicalGameObjects有边界框,并定义处理冲突的逻辑,还需要访问GameObject属性(加速度,速度等)
问题是,当我想定义一个需要继承VisibleGameObject和PhysicalGameObject(它们共享一个父GameObject)的行为的具体对象时会发生什么?我的理解是,这种循环继承是一个很糟糕的主意。
我怎样才能重构这一点,基本上将特定行为强制转换为依赖于父抽象类状态的具体子类(drawable,collidable)?
编辑:我的想法是将它们分配给GameObjects的具体实例作为组件,支持与is-a关系的has-a关系。然而,即使这样看起来也不那么干净;试图通过搜索可组合组件的“组件”列表来检查对象是否可以碰撞,这似乎也不是很好。
答案 0 :(得分:1)
好像你正在寻找trait
不幸的是,虽然有multiple modules尝试实现模型,但python本身并不支持特征。
我的建议(除非你想依赖于所提到的模块)将编写抽象类来公开你想要的行为,但是不继承主类 - 将它留给第三个类,它继承了main,以及行为类。
一个例子可能不那么令人困惑:
创建一个Visible
抽象类,使不继承自GameObject
,并公开所有预期的行为/函数(就好像它继承自{{ 1}})。然后,让GameObject
继承VisibleGameObject
和GameObject
。
显然,你只能在像python这样的动态语言上编写Visible
- 否则编译器会抱怨它无法访问不存在的字段。