铸造和类型问题

时间:2010-01-22 11:25:36

标签: c# inheritance casting overloading

我在我的应用程序中冒泡事件,因此使用bubble events方法。由于此方法处理各种冒泡事件,因此它们是一个switch或if语句,用于确定我们正在处理的事件类型。我想知道我是否可以通过创建事件args类的不同版本来解决这个问题。所以让我解释一下,说我有两种类型的事件处理不同,称为X和Y,我为这两个事件创建新的事件args类,因为它们存储不同类型的信息。

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)
{}

但当然问题是OnBubbleEvent方法中的EventArgs e在调用时属于EventArgs类型。但是我们知道它不是。那么为了让方法调用起作用,我将如何将其重新置于实际类型?

非常感谢,希望你可以帮助我,这似乎很容易就像一个可能会遗漏的东西或者它无法完成

任何想法??

1 个答案:

答案 0 :(得分: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);
    }
}