代码之家  ›  专栏  ›  技术社区  ›  Jack Kada

为什么处理事件时发送方类型为空

  •  5
  • Jack Kada  · 技术社区  · 15 年前

    从C通过clr:

    注意很多人想知道为什么 事件模式需要发件人 参数始终为对象类型 毕竟,因为邮件经理会 是引发事件的唯一类型 newmail eventargs对象,它使 回调方法对 原型设计如下:

    void MethodName(MailManager sender, NewMailEventArgs e);
    

    模式需要发送者 参数大部分为对象类型 因为遗产如果麦 lmanager被用作 smtpmailmanager?在这种情况下, 回调方法应具有 发送方参数原型化为 smtpmailmanager而不是mail 经理,但这不会发生,因为 smtpmai lmanager刚继承了 newmai l事件的代码 希望smtpmail管理器提升 事件必须仍然强制 中smtpmailmanager的sender参数 换句话说,演员还是 必需,因此sender参数 也可以作为对象键入。

    输入发件人的下一个原因 作为对象的参数 它允许代理 可供多种类型的 传递新邮件的事件 EventArgs对象,例如, Popmai lmanager类可以使用 即使此类不是 从邮件管理器派生

    我只是无法理解为什么发送者是一个对象——为什么不能将其遗传?所以大多数时候我们不需要做一般的强制转换

    2 回复  |  直到 15 年前
        1
  •  7
  •   John Saunders    15 年前

    C版本1中不存在泛型。

        2
  •  3
  •   JustLoren    15 年前

    即使围绕这个实现了泛型,您仍然会遇到同样的问题。在你的内心 MailManager 对象,您将调用 this.EventName<MailManager>(this, args) ,因此它只匹配订阅该类型事件的人。

    当然,它们可以重新构建方法和事件被clr查找的整个过程,从而使其非常松散。不过,我们将使用javascript而不是C:p