2010-01-22 126 views
2

我在我的應用程序冒泡事件,因此使用泡沫事件方法。由於此方法處理各種冒泡事件,因此它們是一個開關或其中的語句,以確定我們正在處理的事件。我想知道是否可以通過創建不同版本的事件參數類來解決這個問題。因此,讓我解釋一下,假設我有兩種類型的事件,它們的處理方式分別稱爲X和Y,我爲這兩個事件創建新的事件參數類,因爲它們存儲不同類型的信息。鑄造和類型問題

public class EventsArgsX : EventsArgs 

public class EventsArgsY : EventsArgs 

然後當我從什麼地方在我的應用RaiseBubbleEvent我可以通過其中兩個事件ARG基於類型的,所以..

EventArgsX foox = new EventArgsX(); 
RaiseBubbleEvent(null,foox); 

EventArgsY fooy = new EventArgsY(); 
RaiseBubbleEvent(null,fooy); 

那麼OnBubbleEvent方法拿起這個,誰的簽名是 重寫OnBubbleEvent(object source,EventArgs e)

現在我不能重載此方法,因爲它被覆蓋的擺在首位,所以我想我能做的只是與它的過載的另一種方法來處理這個問題,所以

protected override OnBubbleEvent(object source, EventArgs e) 
{ 
    DoStuff(e); 
} 

private void DoStuff(EventArgsY args) 
{} 

private void DoStuff(EventArgsX args) 
{} 

但當然,問題是, OnBubbleEvent方法中的EventArgs e在調用時是EventArgs類型的。但是我們知道它不是。那麼爲什麼我會回到它的實際類型以便方法調用工作?

非常感謝,希望你能幫助我這個,它看起來真的很容易喜歡一個可能失去了一些東西,或者它只是不能做

任何想法?

+0

我想我還沒有弄明白。爲什麼你不能寫兩個OnBubbleEvent方法?你可以覆蓋重寫的方法?! – Thorsten79 2010-01-22 11:32:38

回答

1

很簡單:

protected override OnBubbleEvent(object source, EventArgs e) 
{ 
    if(e is EventArgsX) 
     DoStuff((EventArgsX)e); 
    else if(e is EventArgsY) 
     DoStuff((EventArgsY)e); 
} 

這是KISS,不是很可擴展性。如果你打算增加更多的事件類型,你可以試試double dispatch

public abstract class EventArgsBase : EventArgs 
{ 
    public abstract void Bubble(IEventBubbler eb);   
} 

public interface IEventBubbler 
{ 
    Bubble(EventArgsX ex); 

    Bubble(EventArgsY ey); 
} 

public class EventArgsX : EventArgsBase 
{ 
    public virtual void Bubble(IEventBubbler eb) 
    { 
     eb.Bubble(this); 
    } 
} 

public class EventArgsY : EventArgsBase 
{ 
    public virtual void Bubble(IEventBubbler eb) 
    { 
     eb.Bubble(this); 
    } 
}