我目前正在Python的2D游戏平台上工作。我创建了一个超类:Block
。我还创建了Block
的两个子类:Solid
(你不能跳过(&Semi_Solid
(您可以从下面跳过去(。现在我想添加一个从Solid
或Semi_Solid
继承的类Platform
(以允许这些块移动(,这样它的实例就可以具有Solid
或Semi_Solid
的属性。
那么,如何创建可以从Solid
或Semi_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设计的最好的文本。