Вы можете сделать это несколькими способами, одним из способов может быть использование typedef для определения универсальной функции-обработчика:
class Event {
final String type;
Event(this.type);
}
typedef EventHandler(Event event);
interface EventTarget {
Map<String,EventHandler> get on();
void dispatch(Event event);
}
class Foo implements EventTarget {
Map<String, EventHandler> _handlers;
Foo() {
_handlers = new Map();
}
Map<String, EventHandler> get on() {
return _handlers;
}
dispatch(Event event) {
EventHandler handler = _handlers[event.type];
handler(event);
}
}
main() {
Foo foo = new Foo();
foo.on['bar'] = (Event event) => print('handling event ${event.type}');
foo.dispatch(new Event('bar'));
}
Я сделал для вас фрагмент DartBoard здесь , чтобы поиграть с ним.
Возможно, вы захотите поэкспериментировать с превращением EventTarget в базовый класс, если только это не испортит вашу стратегию наследования (в этом случае шина событий, которую вы можете внедрить с фабрикой, может оказаться более подходящей) .