在派生类的构造函数中添加事件处理程序或覆盖OnX()方法?

Jay*_*Jay 5 .net c# events inheritance

在设计派生类时,如果不需要更改方法,那么在ctorvs中覆盖OnEventName()方法并添加一些行为(以及调用基本方法)的基类事件中添加处理程序是否有优势?基本方法并不关心事情发生的顺序,但只想要一个具有一点额外行为的可重用组件?

基类:

public abstract class BaseClass
{
    public event EventHandler SomeEvent;
    protected void OnSomeEvent(object sender, EventArgs e)
    {
        // do some stuff
    }
}
Run Code Online (Sandbox Code Playgroud)

选项A:

public class DerivedA
{
    protected override void OnSomeEvent(object sender, EventArgs e)
    {
        // do some other stuff
        base.OnSomeEvent(sender, e);
    }
}
Run Code Online (Sandbox Code Playgroud)

选项B:

public class DerivedB
{
    public DerivedB()
    {
        SomeEvent += (o,e) => { // do some other stuff };
    }
}
Run Code Online (Sandbox Code Playgroud)

sha*_*tor 2

您已经提到了事物的调用顺序。其他一些事情确实不会经常发生,但可能很重要(基于基类控制如何调用事件处理程序的事实):

  • 事件处理程序可能会在不同的线程上调用;
  • 在某些情况下,基类可能选择根本不调用事件处理程序;
  • 基类可能会捕获处理程序抛出的特定类型的异常;您的处理程序抛出的异常可能会无意中被吞掉。

一般来说,我倾向于将事件视为专门为类的用户而存在,设计良好的类具有On...子类的虚拟方法。