Python中的一个类如何从两个可能的超类继承



我目前正在Python的2D游戏平台上工作。我创建了一个超类:Block。我还创建了Block的两个子类:Solid(你不能跳过(&Semi_Solid(您可以从下面跳过去(。现在我想添加一个从SolidSemi_Solid继承的类Platform(以允许这些块移动(,这样它的实例就可以具有SolidSemi_Solid的属性。

那么,如何创建可以从SolidSemi_Solid继承的Platform实例?我有义务创建两个不同的类吗

所以我尝试了:

class Block:
pass
class Solid(Block):
pass
class Semi_Solid(Block):
pass
x = "solid"
class Platform(Solid if x=="solid" else Semi_Solid):
pass
obj1 = Platform()
x = "semi-solid"
obj2 = Platform()

但是x的变化没有被考虑在内。我有两个坚实的平台

我做了其他几次测试,但都没有成功。谢谢你的帮助。

继承可能是最被高估的OO特性,唉,在大多数介绍OO的文献中,它通常被认为是一刀切的解决方案。事实上,真正的主要OO特性是封装(这本身不是数据隐藏,而是定义自包含的组件的能力,这些组件将状态和行为组合在一起,并从客户端代码中抽象实现细节(和多态调度(通过使用通用API以统一的方式使用来自不同类型/具有不同实现的对象的能力(。

在语义层面上,继承描述了一种"是"的关系——如果B从a继承,那么B就是a(参见利斯科夫替换原理(。那么,你的"平台"是"固体"还是"半固体"?(提示:这当然是一个重新思考的问题(。

在实现级别上,继承主要是一种固定的(静态的(且在某种程度上受到限制的组合/委托形式——子类中没有实现的东西都被委托给其父类。好的OO设计是基于将响应和不变量从变体中分离出来,将"变体"部分委托给另一个对象。战略模式及其近亲国家模式就是一个例子。

很可能,你的问题的答案主要是使用Strategy模式来处理实心块和半实心块之间的行为差异——在这种情况下,你只有一个Block类来负责所有类型的块所共有的一切,以及"跳转"行为的策略(以及块之间的其他最终行为差异(。然后,你的平台类——它不一定是Block子类(根据上下文,可能是正确的设计,也可能不是正确的设计(——会以"跳转"策略作为参数(如果你决定将其作为Block(,或者如果你决定不将其作为块子类,则会以Block实例(使用适当的策略创建(。

这不仅解决了您当前的问题,还允许在不接触现有代码的情况下添加新策略等,并避免类的组合爆炸。

注意:你可能想给自己一份GOF"设计模式"的副本,不是为了模式目录本身(无论多么有趣(,而是为了本书的第一部分(长(介绍,这是迄今为止关于正确OO设计的最好的文本。

最新更新