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

通常のイディオムは、Event を渡し、ポリモーフィズムにすべてを処理させることです。

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 に答える