来自C#通过CLR:
注意很多人都想知道为什么 事件模式需要发件人 参数始终为Object类型 毕竟,因为MailManager会 成为举办活动的唯一类型 它是一个NewMail EventArgs对象 更有意义的回调方法 原型如下:
void MethodName(MailManager sender, NewMailEventArgs e);
该模式需要发件人 参数主要是Object类型 因为继承如果迈 lManager用作基类 SmtpMailManager?在这种情况下, 回调方法应该有 发送者参数原型为 SmtpMailManager而不是Mail 经理,但这不可能发生,因为 SmtpMai lManager刚刚继承了 NewMai l事件那么代码就是 期待SmtpMail经理人提高 事件必须仍然必须施展 发送者参数到SmtpMailManager中 换句话说,演员阵容仍在 必需的,所以发送者参数 也可以输入Object。
输入发件人的下一个原因 作为对象的参数就是 灵活性它允许代表 被提供的多种类型使用 传递NewMail的事件 EventArgs对象例如,a PopMai lManager类可以使用 代表即使这个班级不是 从Mail Manager派生
我只是简单地无法理解为什么发件人是一个对象 - 为什么它不能被一般化?所以大多数时候我们不需要做通用演员
答案 0 :(得分:7)
C#版本1中不存在泛型。
答案 1 :(得分:3)
即使围绕此实现了泛型,您仍然会遇到同样的问题。在MailManager
对象中,您可以调用this.EventName<MailManager>(this, args)
,因此它只会与订阅该类型事件的人匹配。
当然,他们可以修改CLR查找方法和事件的整个方式,以便它非常松散。然后我们会使用Javascript#而不是C#,但是:p