Когда вы должны переопределить OnEvent, а не подписываться на событие при наследовании - программирование
Подтвердить что ты не робот

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

Когда нужно делать следующее?

class Foo : Control
{
    protected override void OnClick(EventArgs e)
    {
        // new code here
    }
}

В отличие от этого?

class Foo : Control
{
    public Foo()
    {
        this.Click += new EventHandler(Clicked);
    }

    private void Clicked(object sender, EventArgs e)
    {
        // code
    }
}
4b9b3361

Ответ 1

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

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

Ответ 2

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

Ответ 3

Имейте в виду, что (по крайней мере, в .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
    }
}

Ответ 4

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

Ответ 5

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

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

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

Ответ 6

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