2017-06-22 3 views
1

habe ich eine Klasse Action und eine Klasse Person, so dass jede Person hat viele Aktionen, die es tun können. Ich möchte, dass jede Instanz der Action Klasse eine andere Version der Methode Action.Execute hat. Wie kann ich das in Java machen?eine Methode für jede Instanz einer Klasse in Java

public class Action 
{ 

    public String Identifier; 
    public String[] Identifiers; 

    public Action(String Inpt) 
    { 
    this.Identifier = Inpt; 
    } 

    public void Execute() 
    { 
    System.out.println("Template Empty"); 
    } 
} 

Ich möchte in der Lage sein, so etwas zu tun (ich weiß, dass es keinen Sinn macht, aber ich möchte Sie auf die Idee verstehen):

public class Main 
{ 
    public static void main(String[] args) 
    { 
     Action a = new Action("X"); 
     a 
     { 
      public void Execute() 
      { 
       //do something diferent 
      } 
     } 

     Action b = new Action("J"); 
     b 
     { 
      public void Execute() 
      { 
      //do something ELSE 
      } 
     } 

    } 

} 
+1

können Sie eine Schnittstelle – lidox

Antwort

0

Sie benötigen Action Klasse machen abstrakt. Erstellen Sie dann für jede Aktion neue Unterklassen, z. B. Run, Walk, Swim.

public abstract class Action { 
    abstract void execute(); 
} 

public class Run extends Action { 
    @Override 
    void execute() { 
     System.out.println("Running"); 
    } 
} 

public class Swim extends Action { 
    @Override 
    void execute() { 
     System.out.println("Swimming"); 
    } 
} 

Wenn Sie weiter die Visitor Pattern verwenden, können Sie gehen wollen und dann die Action zum Person Klasse übergeben:

public abstract class Action { 
    abstract void execute(Person person); 
} 

public class Run extends Action { 

    @Override 
    void execute(Person person) { 
     System.out.println(person.getName()+" is running"); 
    } 

} 

dann in Ihrer Person Klasse:

public void executeAction(Action action) { 
    action.execute(this); 
} 

geben :

Action action = new Run(); 
myPerson.executeAction(action); 

Das bedeutet, dass die Person muss nicht wissen, wie man schwimmen, laufen oder laufen, es ist alles in der Action Klasse, die es "besucht" enthalten.

+0

mmm verwenden, die funktioniert, das Problem ist, dass ich vielleicht Tausende von "Aktionen" habe, wenn ich abstrakte Klassen oder Interfaces verwenden würde, müsste ich Tausende von Children-Klassen schreiben. Ich habe mich gefragt, ob es eine andere Möglichkeit gab, die Methode zu überschreiben –

+0

Ja, gibt es. Ich werde eine Antwort posten, wenn ich später Zeit habe. Aber ja, Sie können nur die Methode überschreiben, ohne eine ganz neue Klasse zu deklarieren. Es gibt [einige Beispiele hier] (https://docs.oracle.com/javase/tutorial/java/javaOO/anonymyclasses.html) –

+0

Danke, dass yould wirklich nützlich sein –

6

können Sie method overridingmethod overriding javadoc Konzept wie unten verwenden: -

public abstract class Action { 

    public String Identifier; 
    public String[] Identifiers; 

    public Action(String Inpt) { 
     this.Identifier = Inpt; 
    } 

    protected abstract void Execute(); 
} 

class HumanAction extends Action { 

    public HumanAction(String Inpt) { 
     super(Inpt); 
    } 

    @Override 
    public void Execute() { 
     System.out.println("human action"); 
    } 
} 

class AnimalAction extends Action { 
    public AnimalAction(String Inpt) { 
     super(Inpt); 
    } 

    @Override 
    public void Execute() { 
     System.out.println("animal action"); 
    } 
} 

Jetzt in Ihrem Test-Klasse: -

public class ActionTest { 
    public static void main(String[] args) { 
     HumanAction hu = new HumanAction("X"); 
     hu.Execute(); 

     AnimalAction animal = new AnimalAction("X"); 
     animal.Execute(); 


    } 
} 

O/p von denen unten sein wird: -

menschliche aktion tierische aktion

EDIT: - Ein passendes Beispiel mit ausführbarem Code hinzugefügt.

+0

Ich kann nicht runabble Beispiel bieten, weil es nicht läuft, das Problem der Verwendung von abstrakten Klassen und Interfaces ist, dass ich vielleicht Tausende von "Aktionen" haben, also würde ich schreiben müssen Tausende von Kindern Klassen –

+2

@ VíctorEduardoAvilésRomo, es ist nicht der Fall, Sie definieren nur alle Aktionen abstrakt oder mit der minimalen Implementierung und in diesem Fall müssen Sie nicht eine Aktionsklasse für jede Aktion haben, nur Klasse, die zu verbessern oder zu ändern das Standardverhalten, sie müssen implementieren oder erweitern die Klasse, das ist der empfohlene Weg in OOPS-Programmierung. –

+0

@ VíctorEduardoAvilésRomo, lassen Sie mich wissen, ob dies Ihr Problem gelöst hat oder nicht? –

Verwandte Themen