1

假设我有:

class Event {}
class DoorBell extends Event {}
class PhoneCall extends Event {}
class EventGenerator {
    static Event getEvent() {
         if (today.isSunday())
            return new DoorBell()
         else 
            return new PhoneCall();
    }
}
class EventHandler {    
    void HandleEvent(DoorBell doorBell) { answer door; }
    void HandleEvent(PhoneCall phoneCall) { answer phone; }
    void consumeEvent() {
         Event e = EventGenerator.getEvent();
         HandleEvent(e);
    }
}

由于 HandleEvent(Event) 未定义,HandleEvent(e) 无法编译。有解决方案吗?还是我必须问一下它是什么类型的事件?

4

1 回答 1

4

通常的习惯用法是传递一个事件并让多态性为您处理这一切。

EventHandler如果没有任何行为,我认为您的班级没有任何价值。所提出的您的设计没有提供多态性的好处。这就是你必须检查类型的原因。最好有这样的东西:

public interface EventHandler {
    void handle(Event event);
}

访问者模式(又名“双重调度”)可能是处理这种情况的好方法。

或者您可以尝试泛型:

public class EventHandler {
   public <T> void consumeEvent(T event) {
       // handler code here, dependent on T
   }
}

我不知道 JDK 7 是否有新的东西可以帮助你。对不起; 我仍然坚持使用 JDK 6。

于 2012-12-16T14:04:55.960 回答