【问题标题】:Casting and Types Question铸造和类型问题
【发布时间】:2010-01-22 11:25:36
【问题描述】:

我在我的应用程序中冒泡事件,因此使用冒泡事件方法。由于此方法处理各种冒泡事件,因此它们是一个 switch 或 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(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 类型。然而我们知道它不是。那么,为了使方法调用起作用,我将如何将其恢复为实际类型?

非常感谢,希望您能帮我解决这个问题,这似乎很容易,就像可能遗漏了什么或者无法完成一样

有什么想法吗??

【问题讨论】:

  • 我想我还不明白。为什么不能写两个 OnBubbleEvent 方法?你可以覆盖一个被覆盖的方法?!

标签: c# inheritance casting overloading


【解决方案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);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-05
    • 2021-01-16
    • 2013-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    相关资源
    最近更新 更多