用多态类

时间:2017-09-29 07:33:37

标签: java polymorphism

我使用switch语句对存储Event类型对象的PriorityQueue进行排序。

  private PriorityQueue<Event> events = new PriorityQueue<Event>();

现在,事件可以是两种状态之一,ARRIVALDONE

class Event implements Comparable<Event> {
  private int eventType;

  public Event(int type) {
    this.eventType = type;
}

事件就是这样生成的。

Event newArrival = new Event(1) // or 2
this.events.add(newArrival);

整数1代表ARRIVAL2代表DONE

我有以下switch语句,它根据Event对象的事件类型执行某些操作。

//Event is polled out and passed to simulateEvent.
public void simulateEvent(Event e) {
    switch (e.getEventType()) {
      case 1:
        Event e = new Event(2) // If event is "1", queue a new "2", done event.
        events.add(e);
        ... 
      case 2:
        ...
      default:
        System.err.printf("Unknown event type %d\n", e.getEventType());
  }

现在我的教授告诉我,我可以使用多态来实现这一目标,即

abstract class Event implements Comparable<Event>{
}

class ArrivalEvent extends Event implements Comparable<Event>{

}

class DoneEvent extends Event implements Comparable<Event>{

}

到目前为止,我见过的所有多态示例都在讨论使用父类创建数组,因此减少了创建单个子对象的需要。

但是,我不确定如何实现我的模拟器可以测试的类似的多态风格事件。考虑到在构造函数中设置了事件类型,我将如何调整我的代码,以便我可以删除switch语句?

2 个答案:

答案 0 :(得分:4)

事件本身应该包含要在交换机中执行的代码,所以基本上

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

所以在你的事件处理程序中,你可以简化为

public void simulateEvent(Event e) {
    e.execute();
}

并且实现进入这样的具体类:

public class ArrivalEvent implements Event {
    public void execute() {
        arrivals.add(new DoneEvent());
    }
}

作为旁注,我将EventType更改为枚举:

public enum EventType {
     ARRIVAL, DONE;
}

为ARRIVAL删除1,为DONE删除2。 如果您在上述更改后事件需要事件类型。

答案 1 :(得分:1)

你可以这样做。

   public interface Event extends Comparable<Event>{
       void updateEvents(PriorityQueue events);
   }

   public class ArrivalEvent implements Event{

     public void updateEvents(PriorityQueue events) {
         events.add(DoneEvent.getInstance());
     }

     public static Event getInstance() {
         return new ArrivalEvent();
     }

   }

   public class DoneEvent implements Event {

     public void updateEvents(PriorityQueue events) {
         // Whatever is needed
     }

     public static Event getInstance() {
         return new DoneEvent();
     }

   }

   public void simulateEvent(Event e) {
       e.updateEvents(events);    
   }