向父 class 中的函数添加条件更好,还是为每个子 class 定义单独的函数更好?
Is it better to add conditionals to a function in a parent class, or to define separate functions for each subclass?
我正在开发一个简单的游戏程序,玩家可以在其中控制两个不同的令牌 - 我们称它们为 Soldier
和 Scout
- 表示为 类。这些 类 都继承自 Actor
,这总结了它们的相似之处。
Soldier
和Scout
都可以攻击,而且攻击目标的方式相同,所以Actor
有一个功能attack(target)
。但是,Soldier
和Scout
抵御攻击的方式不同,所以defend()
函数不能一直做同样的事情。 (还有几个类似的功能和情况,但这提供了一个很好的例子。)
问题是:我应该如何以及在哪里实施 defend()
?
选项 A:在 Actor
中实施 defend()
,根据 Actor
是否为 [=] 添加条件来更改行为13=] 或 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:在 Soldier
中实施 defend()
的一个实例,使用 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?坦率地说,我不太确定我所说的 "better" 是什么意思 - 我主要想知道最佳实践指南是否支持或谴责一个选项或另一个选项。
肯定是后者。前一种方法要求父 class 了解其所有子 class,这与能够轻松扩展代码的观点背道而驰。
我正在开发一个简单的游戏程序,玩家可以在其中控制两个不同的令牌 - 我们称它们为 Soldier
和 Scout
- 表示为 类。这些 类 都继承自 Actor
,这总结了它们的相似之处。
Soldier
和Scout
都可以攻击,而且攻击目标的方式相同,所以Actor
有一个功能attack(target)
。但是,Soldier
和Scout
抵御攻击的方式不同,所以defend()
函数不能一直做同样的事情。 (还有几个类似的功能和情况,但这提供了一个很好的例子。)
问题是:我应该如何以及在哪里实施 defend()
?
选项 A:在 Actor
中实施 defend()
,根据 Actor
是否为 [=] 添加条件来更改行为13=] 或 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:在 Soldier
中实施 defend()
的一个实例,使用 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?坦率地说,我不太确定我所说的 "better" 是什么意思 - 我主要想知道最佳实践指南是否支持或谴责一个选项或另一个选项。
肯定是后者。前一种方法要求父 class 了解其所有子 class,这与能够轻松扩展代码的观点背道而驰。