我正在开发一个简单的游戏程序,在该程序中,玩家可以控制两个不同的令牌-我们将它们称为SoldierScout-以类表示。这些类都继承自Actor,这包裹了它们的相似之处。

SoldierScout都可以以相同的方式攻击和攻击目标,因此Actor具有功能attack(target)。但是,SoldierScout对攻击的防御方式不同,因此defend()函数不能一直做相同的事情。 (还有更多类似的功能和情况,但这提供了一个很好的例子。)

问题是:我应该在哪里以及如何实现defend()

选项A:在defend()中实现Actor,添加条件以更改行为,具体取决于ActorSoldier还是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?坦白说,我不太清楚“更好”的意思-我主要是想知道最佳实践准则是否支持或谴责了一个或另一个。

最佳答案

绝对是后者。前一种方法要求父类知道其所有子类,这与能够轻松扩展代码的观点背道而驰。

09-27 20:19