代码之家  ›  专栏  ›  技术社区  ›  Jay

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

  •  5
  • Jay  · 技术社区  · 14 年前

    在设计派生类时,将处理程序添加到 ctor vs覆盖 OnEventName() 方法并添加一些行为(以及调用基方法),如果一个人不需要更改基方法,也不关心事情发生的顺序,只需要一个具有一点额外行为的可重用组件?

    基类:

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

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

    方案B:

    public class DerivedB
    {
        public DerivedB()
        {
            SomeEvent += (o,e) => { // do some other stuff };
        }
    }
    
    2 回复  |  直到 14 年前
        1
  •  2
  •   anton.burger    14 年前

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

    一般来说,我倾向于将事件看作是专门为类的用户准备的,而设计良好的类则具有虚拟资源 On... 子类的方法。

        2
  •  3
  •   LBushkin    14 年前

    没有了 重要的 两种方法的优点/缺点。

    订阅事件和重写基类方法之间有一些区别。例如,如果您希望某些代码在所有其他处理程序之前或之后运行,则应该重写 OnSomeEvent 方法,因为没有其他方法可以证明这一点。但你表明你并不真的在乎这个。

    一般来说,重写方法需要很好地理解基类的行为,以确保不会无意中破坏任何内容。订阅事件是一种侵入性较低的扩展,而且(可能)是基类设计器已经计划好的。

    事项 . 这里的差别很可能是微不足道的,我们应该更关注简单性、正确性和易维护性,而不是性能。