覆盖事件处理程序是一种不好的做法

时间:2013-04-15 14:37:14

标签: .net

与从事件处理程序调用受保护的方法并覆盖受保护的方法相比,覆盖事件处理程序是一种不好的做法。

如果覆盖事件处理程序,是否存在任何安全问题或任何副作用。

namespace Testing
{
  public class Owner
  {
    public event EventHandler<EventArgs> OnAction;
  }

  public class Foo
  {
    public Foo(Owner owner)
    {
       owner.OnAction += OnAction;
      owner.OnAction += OnAction2;
    }

    protected virtual void OnAction(object sender, EventArgs eventArgs)
    {
    }

    private void OnAction2(object sender, EventArgs eventArgs)
    {
      ProtectedMethod();
    }

    protected virtual void ProtectedMethod()
    {
    }
  }

  public class FooDerived: Foo
  {
    public FooDerived(Owner owner) : base(owner)
    {
    }

    protected override void OnAction(object sender, EventArgs eventArgs)
    {
      // Do Something
      base.OnAction(sender, eventArgs);
    }
  }

  public class FooDrived2: Foo
  {
    public FooDrived2(Owner owner) : base(owner)
    {
    }

    protected override void ProtectedMethod()
    {
      // Do something
      base.ProtectedMethod();
    }
  }
}

2 个答案:

答案 0 :(得分:2)

我不会说覆盖事件处理程序的委托方法是不好的做法。这是一种像其他任何方法一样的方法。话虽这么说,但这不是我通常会做的事情。如果我需要任何覆盖,我将构建(并实现)一个包含所有方法签名的接口。然后覆盖/遮蔽/隐藏/在接受的接口方法和事件上发生的任何事情只会是负责调用适当的接口方法的附加方法。

直接覆盖事件处理程序将不会具有任何不太可读(或可维护的IMO)。接口只是我帮助测试和扩展的习惯。

答案 1 :(得分:1)

我只能想到一个覆盖事件处理程序会有用的情况。

假设您有一个事件,它为您提供给定类型的事件处理程序。如果您希望更改传递给将由处理程序调用的方法的参数,则可以覆盖它。否则覆盖它们只是一个noop。

如果参数无论如何都是相同的(或者如果它们的类型是原始处理程序中声明的类型的子类型)并且您希望派生类以不同的方式处理事件,那么您应该覆盖它的方法。