Man*_*ani 25 c# polymorphism events overriding
考虑以下代码:
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???
}
}
}
Run Code Online (Sandbox Code Playgroud)
在此代码中,ReSharper显示警报"调用多态字段事件".
我的问题是:它究竟意味着什么?这是一个糟糕的编程习惯的警报吗?此外,以多态方式调用事件是不好的做法吗?(知道事件只能从声明它的类中提出.)
Jon*_*eet 42
嗯,你实际上在这里有两个类似场的事件.您的覆盖将覆盖添加/删除部分,但您将拥有两个字段 - 一个输入TableMain和一个输入TableSub.只有in中的那个TableSub才会是非null,除非在TableMain...中明确设置了值,所以如果TableMain尝试引发事件本身,它将不会调用同一组处理程序TableSub.基本上,它会表现得很奇怪.
正确的方法是提供受保护的方法,TableMain以允许子类引发事件:
protected void OnUpdateFilter()
{
Action handler = UpdateFilter;
if (handler != null)
{
handler();
}
}
Run Code Online (Sandbox Code Playgroud)
然后使事件非虚拟,并删除覆盖TableSub.
请注意,您的事件签名与事件的正常约定不符 - 任何不使用的原因EventHandler?