2013-04-15 85 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。

如果參數無論如何都是相同的(或者它們的類型是原始處理程序中聲明的類型的子類型)並且希望派生類以不同方式處理事件,那麼應該覆蓋它的方法。

相關問題