我正在开发一个简单的游戏程序,玩家可以控制两个不同的令牌 - 让我们称之为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?坦率地说,我不太确定“更好”是什么意思 - 我主要想知道一个选项或另一个选项是否受到最佳实践指南的支持或批评。
答案 0 :(得分:4)
绝对是后者。前一种方法要求父类知道它的所有子类,这种方式与能够轻松扩展代码的方式相悖。