2017-06-22 67 views
1

我創建了Action類和Person類,因此每個Person都有很多可以執行的操作。我希望Action類的每個實例都擁有方法Action.Execute的不同版本。 我怎樣才能在Java中做到這一點?覆蓋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"); 
    } 
} 

我希望能夠做這樣的事(我知道這是沒有意義的,但我希望你能理解的想法):

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

你可以使用一個接口 – lidox

回答

0

你需要讓你的Action類抽象。然後爲每個動作創建新的子類,例如RunWalk,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"); 
    } 
} 

如果你想走得更遠,你可以使用Visitor Pattern,然後通過ActionPerson類:

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"); 
    } 

} 

然後在Person類:

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

給:

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

這意味着Person不需要知道如何游泳,散步或跑步,它都包含在Action類中,「訪問」它。

+0

mmm工作,問題是我可能會有成千上萬的「操作」,所以如果我使用抽象類或接口,我需要編寫數千個兒童類。我想知道是否有另一種方法來覆蓋方法 –

+0

是的,有。如果我稍後有空,我會發佈一個答案。但是,是的,你可以重寫這個方法,而不用聲明一個全新的類。有[這裏有一些例子](https://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses。html) –

+0

謝謝你,這真的很有用 –

6

可以使用method overridingmethod overriding javadoc觀象下面這樣: -

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"); 
    } 
} 

現在,在您的測試類: -

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這將低於: -

人爲動作 動物行動

編輯: - 添加適當的例子與可運行的代碼。

+0

我不能提供可運行的例子,因爲它不運行,使用抽象類和接口的問題是,我可能會有成千上萬的「操作」,那麼我需要寫成千上萬的兒童類 –

+2

@VíctorEduardoAvilésRomo,它不是這種情況,你只需定義所有的動作抽象或最小的實現,在這種情況下,你不需要爲每個動作有另一個動作類,只需要增強或改變的類默認行爲,他們需要實現或擴展類,這是OOPS編程中的推薦方式。 –

+0

@VíctorEduardoAvilésRomo,讓我知道這是否解決了你的問題? –