代码之家  ›  专栏  ›  技术社区  ›  Manish Basantani

多态场样事件的调用

  •  25
  • Manish Basantani  · 技术社区  · 15 年前

    考虑到以下代码:

    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 回复  |  直到 11 年前
        1
  •  42
  •   Jon Skeet    15 年前

    好吧,你真的有 现场活动。您的覆盖将覆盖添加/删除部分,但您将有两个字段-一个在 TableMain 其中一个 TableSub . 只有一个在 塔姆鲁布 将永远不为空,除非在 塔普林 …所以如果 塔普林 如果尝试引发事件本身,它将不会调用与中相同的一组处理程序。 塔姆鲁布 . 基本上,它会表现得很奇怪。

    正确的方法是在 塔普林 要允许子类引发事件,请执行以下操作:

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

    然后使事件非虚拟,并在 塔姆鲁布 .

    请注意,您的事件签名与事件的正常约定不匹配-任何不使用的原因 EventHandler ?