2010-01-22 2 views
2

Я пузырящиеся события в моем приложении и поэтому, используя метод событий пузыря. Поскольку этот метод обрабатывает всевозможные пузырьковые события, их переключатель или оператор if внутри него определяют, с каким событием мы имеем дело. Мне было интересно, могу ли я обойти это, создав разные версии класса args. Поэтому позвольте мне объяснить, что у меня есть два типа событий, которые обрабатываются по-разному, как 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 (источник объекта, EventArgs e)

теперь я не могу перегрузить этот метод как его переопределенная в первую очередь, так что я думал, что я мог сделать, есть еще один метод с перегрузками в ней справиться с этим, так

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

private void DoStuff(EventArgsY args) 
{} 

private void DoStuff(EventArgsX args) 
{} 

но, конечно, проблема заключается в том, что EventArgs e в методе OnBubbleEvent имеет тип EventArgs во время вызова. Однако мы не знаем его. Итак, как я могу вернуть его к фактическому типу, чтобы вызов метода работал?

Большое спасибо, надеюсь, что вы можете мне помочь с этим, его, кажется, очень легко, как может быть что-то отсутствует или что он просто не могу сделать

любые идеи ??

+0

Я думаю, что пока не понял. Почему вы не можете написать два метода OnBubbleEvent? Вы можете переопределить переопределенный метод ?! – Thorsten79

ответ

1

Это просто:

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

Это, будучи ПОЦЕЛУЙ, не очень расширяемая. Если вы планируете добавлять дополнительные типы событий, вы можете попробовать 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); 
    } 
} 
Смежные вопросы