Ich arbeite an einem einfachen Spielprogramm, bei dem ein Spieler zwei verschiedene Token steuern kann - nennen wir sie Soldier
und Scout
- die als Klassen dargestellt werden. Diese Klassen erben beide von Actor
, was ihre Ähnlichkeiten einschließt.Ist es besser Bedingungen zu einer Funktion in einer übergeordneten Klasse hinzuzufügen oder separate Funktionen für jede Unterklasse zu definieren?
Sowohl Soldier
und Scout
können, und Angriffsziele in der gleichen Art und Weise anzugreifen, so hat eine Funktion Actor
attack(target)
. Allerdings, Soldier
und Scout
abwehren gegen Angriffe anders, so dass die defend()
Funktion kann nicht immer die gleiche Sache tun. (Es gibt mehrere weitere Funktionen und Situationen wie diese, aber das ist ein gutes Beispiel.)
Hier ist die Frage: wie, und wo sollte ich defend()
implementieren?
Option A: Implementieren defend()
in Actor
, conditionals Hinzufügen um das Verhalten zu ändern, je nachdem, ob die Actor
ist ein Soldier
oder ein 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)
Option B: Implementieren einer Instanz in defend()
Soldier
für eine Soldier
das Abwehrverhalten verwendet wird, und eine andere Instanz von defend()
in Scout
für eine Scout
das Abwehrverhalten verwenden.
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
Vielleicht gibt es auch eine Option C? Ehrlich gesagt bin ich nicht ganz sicher, was ich mit "besser" meine - ich suche hauptsächlich, ob die eine oder andere Option durch Best-Practice-Richtlinien unterstützt oder gegeißelt wird.