2013-04-15 45 views
0

与从Event Handler调用受保护的方法并覆盖受保护的方法相比,覆盖事件处理程序是不好的做法。正在覆盖事件处理程序不良实践

这些是否是任何安全问题,或者是否覆盖事件处理程序的任何副作用。

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

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

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

+0

谢谢,你知道任何事件处理程序被重写.Net框架 – skjagini

+0

@SujithJagini:我不能说我这样做。这不是经常出现的东西,通常如果它涉及多个行为,它最终会分解成多种接口方法。 –

1

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

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

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

相关问题