Анонимные внутренние классы в C #

Я сейчас пишу реализацию Wicket на C #, чтобы углубить свое понимание C # и Wicket. Одна из проблем, с которой мы сталкиваемся, заключается в том, что Wicket активно использует анонимные внутренние классы, а C # не имеет анонимных внутренних классов.

Так, например, в Wicket вы определяете ссылку следующим образом:

Link link = new Link("id") {
    @Override
    void onClick() {
        setResponsePage(...);
    }
};

Поскольку Link является абстрактным классом, он вынуждает разработчика реализовать метод onClick.

Однако в C #, поскольку нет анонимных внутренних классов, нет способа сделать это. В качестве альтернативы вы можете использовать такие события:

var link = new Link("id");
link.Click += (sender, eventArgs) => setResponsePage(...);

Конечно, у этого есть пара недостатков. Во-первых, может быть несколько обработчиков Click, что может быть не круто. Это также не заставляет разработчика добавлять обработчик Click.

Другой вариант может заключаться в том, чтобы просто иметь свойство закрытия, подобное этому:

var link = new Link("id");
link.Click = () => setResponsePage(...);

Это решает проблему наличия большого количества обработчиков, но по-прежнему не заставляет разработчика добавить обработчик.

Итак, мой вопрос: как эмулировать нечто подобное в идиоматическом C #?

22
задан cdmckay 22 January 2011 в 19:55
поделиться