Когда должен Вы переопределять OnEvent в противоположность подписке на событие при наследовании

Я улучшил раздел по включению Руководства пользователя.

. Вы можете попробовать его с любым из трех упомянутых примеров, поместив файлы примеров в папку. а затем перетащите в OpenJSCAD

ScreenShot of drag&drop result

Результат должен быть таким же, как в https://openjscad.org/#examples / неоплатони

13
задан MagicKat 1 October 2008 в 19:33
поделиться

6 ответов

Подписка на событие предназначается, чтобы управление следило за развитием событий на другом управлении. Для контроля Вашего собственного события OnClick прекрасен. Отметьте, однако, то Управление. Дескрипторы OnClick, запускающие те подписанные события, так убедиться назвать его в Вашем переопределении.

0
ответ дан 1 December 2019 в 22:58
поделиться

Переопределение вместо того, чтобы присоединить делегата приведет к более эффективному коду, таким образом, будет обычно рекомендоваться всегда сделать это, если это возможно. Для получения дополнительной информации см. эта статья MSDN. Вот подходящая кавычка:

защищенный метод OnEventName также позволяет производным классам переопределять событие, не присоединяя делегата в нем. Производный класс должен всегда называть метод OnEventName базового класса, чтобы гарантировать, чтобы зарегистрированные делегаты получили событие.

9
ответ дан 1 December 2019 в 22:58
поделиться

Знайте, что (по крайней мере, в.NET 2.0) я нашел несколько мест в платформе (конкретно в классе DataTable), где метод OnFoo только назван , когда соответствующее событие Foo было обработано! Это нарушает руководство по проектированию платформы, но мы застреваем с ним.

я обошел его путем обработки события с фиктивным обработчиком где-нибудь в классе, например:

public class MyDataTable : DataTable
{
    public override void EndInit()
    {
        base.EndInit();
        this.TableNewRow += delegate(object sender, DataTableNewRowEventArgs e) { };
    }

    protected override void OnTableNewRow(DataTableNewRowEventArgs e)
    {
        base.OnTableNewRow(e);
        // your code here
    }
}
3
ответ дан 1 December 2019 в 22:58
поделиться

Событие для внешних абонентов. Когда Вы получаете некоторое управление, всегда переопределяете метод OnEvent вместо того, чтобы подписаться на событие. Таким образом, можно быть уверены, когда код называют, потому что фактическое событие запущено при вызове основы. OnEvent (), и можно назвать это перед кодом, после кода, посреди кода или нисколько. Можно тогда также воздействовать на возвращаемые значения от события (т.е. измененные свойства в объекте EventArgs).

8
ответ дан 1 December 2019 в 22:58
поделиться

Если Вы переопределите как комментарии Kent Boogaart, то необходимо будет быть осторожными для призывания обратно основы. OnClick, чтобы позволить событию suscriptions быть названным

0
ответ дан 1 December 2019 в 22:58
поделиться

Наследованный класс никогда не должен подписываться на свои собственные события, или это - события базового класса.

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

, Например, я недавно развернул класс Списка MRU. В нем было много средств управления ToolStripMenuItem, событие щелчка которых я использовал. После того, как то событие щелчка было использовано, я тогда сгенерировал событие своего класса. ( посмотрите что исходный код здесь )

0
ответ дан 1 December 2019 в 22:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: