在Java中为每个类实例重写一个方法

时间:2017-06-22 04:55:45

标签: java

我创建了一个类Action和一个类Person,因此每个Person都可以执行许多操作。我希望Action类的每个实例都具有方法Action.Execute的不同版本。 我怎么能用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
           }
       }

   }

}

2 个答案:

答案 0 :(得分:6)

您可以使用下面的method overriding method 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将在下面: -

  人类的行为   动物行动

编辑: - 添加了可运行代码的正确示例。

答案 1 :(得分:0)

您需要将Action类抽象化。然后为每个操作创建新的子类,例如RunWalkSwim

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,然后将Action传递给Person课程:

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课程中“访问”它。