Вызов полиморфного полеподобного события - PullRequest
25 голосов
/ 15 октября 2010

С учетом кода ниже:

public class TableMain {
    public virtual event Action UpdateFilter;
    ....
}

public class TableSub : TableMain {
    public override event Action UpdateFilter;

    public void UpdateQuery() {
        .....
        if (UpdateFilter!=null) {
              UpdateFilter(); // Invocation of polymorphic field-like event???
        }
    }
}

В этом коде ReSharper показывает предупреждение "вызов полиморфного поляподобного события".

Мой вопрос: Что это на самом деле означает? И это предупреждение о плохой практике программирования? Кроме того, это плохая практика, чтобы назвать событие полиморфно? (Зная, что событие может быть вызвано только из класса, который объявил его.)

1 Ответ

42 голосов
/ 15 октября 2010

Ну, у вас здесь два подобных событиям поля.Ваше переопределение будет переопределять часть добавления / удаления, но у вас будет два поля - одно в TableMain и одно в TableSub.Только значение в TableSub будет ненулевым, если только значение не установлено явно в TableMain ... поэтому, если TableMain попытается вызвать событие само, оно не вызовет тот же набор обработчиков.как в TableSub.По сути, он будет вести себя странно.

Правильный подход - предоставить защищенный метод в TableMain, позволяющий событию вызываться подклассами:

protected void OnUpdateFilter()
{
    Action handler = UpdateFilter;
    if (handler != null)
    {
        handler();
    }
}

Затем создайте событиене виртуальный, и удалите переопределение в TableSub.

Обратите внимание, что ваша подпись события не соответствует обычному соглашению для событий - любая причина не использовать EventHandler?

...