Полиморфизм - твой друг.
class DocumentGenerator {
public void generate(DocumentEvent ev){}
public void generate(MainEvent ev){}
//... and so on
}
Тогда просто
DocumentGenerator dg = new DocumentGenerator();
// ....
dg.generate(event);
Обновление
Некоторые люди высказали возражение, что вам «нужно знать, какие события происходят во время компиляции». И, да, вам явно необходимо знать, какие события вы интерпретируете во время компиляции части генератора, когда еще вы сможете написать генерирующую часть?
В этих конкурирующих примерах используется шаблон Command, что хорошо, но означает, что События должны знать детали не только своего представления, но и того, как напечатать своего представления. Это означает, что каждый класс может иметь два вида изменений требований, к которым они чувствительны: изменения в том, что представляют события, и изменения в том, как события представлены в печати.
Теперь рассмотрим, например, необходимость интернационализации этого. В случае с шаблонами команд вам нужно перейти к n классам для n различных типов событий и написать новые методы do . В случае полиморфизма изменения локализуются в одном классе.
Естественно, если вам нужно один раз интернационализировать, вам может понадобиться много языков, которые заставят вас добавить что-то вроде Стратегии к каждому классу в случае с шаблоном Command, требуя теперь n занятия и время; м языки; опять же, вам нужна только одна стратегия и один класс в случае полиморфизма.
Есть причины выбрать любой из этих подходов, но утверждать, что подход полиморфизма является неправильным просто неверным.