首页 > 编程 > .NET > 正文

VB.NET的Override事件处理程序

2024-07-10 13:02:32
字体:
来源:转载
供稿:网友

vb.net的override事件处理程序

介绍
在类或控件的继承中,子类或子控件封装了父类的所有函数,其中包括事件处理程序。本文将着重讨论在 visual basic .net 应用程序设计中如何正确对待事件处理程序的继承。

读者要求
本文假定读者熟悉面向对象程序设计和类的继承性。若您尚未熟悉它们,请参阅《组件的多态性》 ("polymorphism in components")。

继承事件处理程序
当组件被继承时,它的所有成员都被封装到子类中。事件处理程序是响应特定事件的方法,是组件成员之一,因而也被继承。请看一个典型的事件处理程序:

private sub button1_click(byval sender as system.object, byval e as _
system.eventargs) handles button1.click
static counter as integer = 0
counter += 1
messagebox.show (" this button has been clicked " & _
counter.tostring() & " times.")
end sub

我们看到,宣告部分末尾的 handles 子句把处理程序关联到特定的事件上。具体而言,上述代码将在 button1.click 事件发生时运行。这就是用于定义事件处理程序的典型语法。

为了实现 override ,你必须使用 overridable 关键字,并且重新定义其可见性为 protected 、 protected friend 或者 public 。下面示范如何 override 事件处理程式:

protected overridable sub button1_click(byval sender as system.object, _
byval e as system.eventargs) handles button1.click
static counter as integer = 0
counter += 1
messagebox.show (" this button has been clicked " & _
counter.tostring() & " times.")
end sub

在组件中继承事件处理程序

事件处理程序的 override 固然与其它方法的 override 大同小异,有一点却不得不提:在 override 事件处理程序时必须除去 handles 子句。

如何 override 组件的事件处理程序

1) 在事件处理程序的宣告部分加入 overrides 关键字

请注意:不要附加 handles 子句。因为父类的处理程序已经关联了特定事件,子类将继承这一切。换句话说,父类所关联的事件可以激活子类的处理程序,因而这里的 handles 子句是多余的。
下面示范如何 override 前述事件处理程序:

protected overrides sub button1_click(byval sender as system.object, _
byval e as system.eventargs)
static counter as integer = 0
counter += 1
messagebox.show (" this inherited button has been clicked " & _
counter.tostring() & " times.")
end sub

2) 为什么不需要 handles 子句

前面提到,我们没有使用关联事件的 handles 子句并不是一个疏漏,而是由 .net 框架的事件处理机制所决定的。父类中的 handles 子句将事件处理程序关联到特定事件上,这种关联将被子类继承。因此,即令子类中没有 handles 子句,父类所关联的事件也能激活子类的事件处理程序。倘若此时加上 handles 子句,则处理程序将被再次关联到事件上。重复关联的后果是处理程序将被连续激活两次。例如:

' 错误的代码
protected overrides sub button1_click(byval sender as system.object, _
byval e as system.eventargs) handles button1.click
static counter as integer = 0
' 本例中使用了 handles 子句,
' 因而每当按钮 button1 被点击一次,
' 变量 counter 将会增加两次 ;
counter += 1
' 消息框也会弹出两次,
' 显示的内容也将违背设计意图
messagebox.show (" this inherited button has been clicked " & _
counter.tostring() & " times.")
end sub

结论
在 visual basic .net 中,事件处理程序的 override 可能造成难以侦错的 bug 。例如在使用 handles 子句关联事件处理程序时就要格外小心,以免发生重复关联。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表