我正在开发一个简单的游戏程序,在该程序中,玩家可以控制两个不同的令牌-我们将它们称为Soldier
和Scout
-以类表示。这些类都继承自Actor
,这包裹了它们的相似之处。Soldier
和Scout
都可以以相同的方式攻击和攻击目标,因此Actor
具有功能attack(target)
。但是,Soldier
和Scout
对攻击的防御方式不同,因此defend()
函数不能一直做相同的事情。 (还有更多类似的功能和情况,但这提供了一个很好的例子。)
问题是:我应该在哪里以及如何实现defend()
?
选项A:在defend()
中实现Actor
,添加条件以更改行为,具体取决于Actor
是Soldier
还是Scout
。
class Actor:
def defend(self):
if self.actor_type == "Soldier":
# Defend like a Soldier
elif self.actor_type == "Scout":
# Defend like a Scout
else:
raise TypeError("Invalid actor type: " + self.actor_type)
选项B:在
defend()
中使用Soldier
的防御行为实现Soldier
的一个实例,在defend()
中使用Scout
的防御行为实现Scout
的另一个实例。class Actor:
# Stuff both Soldiers and Scouts can do the same way
class Soldier(Actor):
def defend():
# Defend like a Soldier
class Scout(Actor):
def defend():
# Defend like a Scout
也许还有选项C?坦白说,我不太清楚“更好”的意思-我主要是想知道最佳实践准则是否支持或谴责了一个或另一个。
最佳答案
绝对是后者。前一种方法要求父类知道其所有子类,这与能够轻松扩展代码的观点背道而驰。