Подтвердить что ты не робот

Вызов полиморфного поляподобного события

Учитывая следующий код:

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 показано предупреждение "вызов полиморфного поляподобного события".

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

4b9b3361

Ответ 1

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

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

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

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

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