0

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

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

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();
    }
  }
}
4

2 回答 2

2

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

直接覆盖事件处理程序不会降低可读性(或可维护的 IMO)。接口只是我帮助测试和可扩展性的习惯。

于 2013-04-15T14:50:20.217 回答
1

我只能想到一种情况,其中覆盖事件处理程序会很有用。

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

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

于 2013-04-15T18:31:19.410 回答