2017-11-29 5 views
1

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 Actorattack(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.

Antwort

4

Definitiv letzteres. Der erstere Ansatz erfordert, dass die Elternklasse alle ihre Unterklassen kennt, was gegen den Punkt geht, dass sie in der Lage sind, Ihren Code leicht zu erweitern.

Verwandte Themen