VB.NET的Override事件处理程序

程序

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 子句关联事件处理程序时就要格外小心,以免发生重复关联。

时间: 2024-08-03 09:40:29

VB.NET的Override事件处理程序的相关文章

Henry的VB.NET之旅(十三)—标准事件处理程序

标准|程序 Henry的VB.NET之旅(十三)-标准事件处理程序 韩睿 "感兴趣就好!"大李微微点点头,然后问我道,"你知道程序是怎么知道哪些对象可以引发何种事件,以及怎么样把事件和事件处理程序关联起来?" 见到我迷茫的眼神,大李用鼠标点击打开被Region合起来的"Windows 窗体设计器生成的代码",指着中间的一句自动生成的代码: Friend WithEvents Button1 As System.Windows.Forms.Butt

WSS3SDK之如何创建一个事件处理程序Feature

本例将展示如何添加一个简单的事件处理器来阻止从某列表中删除列表项.这个任务包括两个步骤: 在Visual Studio中创建事件处理程序 将事件处理程序作为Feature添加到WSS中 在Vistual Studio中创建一个事件处理程序 在Visual Studio中通过点击文件->新建->项目来新建一个项目 在新建项目对话框中,选择项目类型为 Visual C# ,模板选择类库 , 名称框中输入 DeletingEventHandler ,然后点击确定. 在解决方案管理器中,选择 Dele

使用Visual Basic.NET重载事件处理程序

visual|程序 使用 Visual Basic .NET 重载事件处理程序 Matthew A. Stoecker Visual Studio Team Microsoft Corporation 2002 年 2 月 概要:本文介绍在 Visual Basic? .NET 中编程时,如何重载事件处理程序.同时还讨论如何使用 Handles 子句. 目录 简介 前提 继承的事件处理程序 组件中继承的事件处理程序 总结 简介 在继承控件或组件时,将创建封装基类的所有功能的新控件或新组件.基类定

通过定制的事件处理程序集成外部应用程序和IBM Content Manager

简介 IBM Content Manager, Version 8.4.1 支持一个用于外部应用程序集成的事件框架.当前支持两种集成类型: 过程集成,专门用于与 FileNet Business Process Manager 的集成 通用集成,用于集成通用外部应用程序 IBM Content Manager, Version 8.4.1(后面简称为 CM8)提供一个用于过程集成的事件处理程序.对于与 FileNet Business Process Manager 之外的其他外部应用程序的集成

timer-为什么在Forms.Timer的事件处理程序里,界面控件依然是不可访问的?

问题描述 为什么在Forms.Timer的事件处理程序里,界面控件依然是不可访问的? 为什么在System.Windows.Forms.Timer的事件处理程序里,界面控件依然是不可访问的? 为什么在System.Windows.Forms.Timer的事件处理程序里,界面控件依然是不可访问的? 为什么在System.Windows.Forms.Timer的事件处理程序里,界面控件依然是不可访问的? 解决方案 自己结贴了.是VS软件的问题,重启下居然好了,抓狂了大半天. 解决方案二: 是跨线程调

js使用函数绑定技术改变事件处理程序的作用域_javascript技巧

第一种,也是 最常见的,就是直接在html标签里面通过指定事件处理程序同名的HTML属性来注册事件,代码如下: 复制代码 代码如下: function eventHandler() { alert("当前作用域是 input 元素本身"); } <input type="button" value="单击我" onclick="eventHandler(this)"/> 第二种方式就是将一个函数赋值给一个事件处理程

JS注册/移除事件处理程序(ExtJS应用程序设计实战)_javascript技巧

在设计ExtJS应用程序时最常做的事情就是注册事件处理程序,因为在ExtJS的世界里,几乎完全由时间组成.因此,ExtJS的设计者使注册事件变得非常容易(同时还提供了非常不容易的方式任你选择)--on/un,也就是上与下两种方式,或是addListener与removeListener,Element的所有子类都可以使用.例如有一个<div/>希望在用户按下时能够给予简单的反馈: <divid="happyDiv"class="happyStyle"

在GridView控件的TemplateField字段中有一DropDownList控件,该DropDownList控件有一事件处理程序。要求:用户选择某一条目(如c)后,c仍显示在DropDownList控件中。怎么做?

问题描述 各位高手: 我在GridView控件中添加一TemplateField字段,然后在该字段的HeaderTemplate中添加一DropDownList控件,再为该DropDownList控件添加一事件处理程序.假设该DropDownList控件有a.b.c.d这4个选项,现在想达到这样的效果:用户选择某一条目(如c)后,c仍显示在该DropDownList控件中.问题是:事件处理程序执行完毕后,DropDownList控件所显示的条目又回到第一个a,而不是c.为什么?请指教,谢谢! 解

visual studio 2013-visual studio的事件处理程序向导中消息类型为空

问题描述 visual studio的事件处理程序向导中消息类型为空 我创建了一个简单的win32项目,然后添加了一个菜单资源,添加了几个菜单项. 然后我右键使用"事件处理程序向导",它的"消息类型"框中是空的,正常的应该有一些消息类型的.如图: