-
vb教程之Visual Basic .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 子句关联事件处理程序时就要格外小心,以免发生重复关联。
介绍 在类或控件的继承中,子类或子控件封装了父类的所有函数,其中包括事件处理程序。 本文将着重讨论在 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 子句关联事件处理程序时就要格外小心,以免发生重复关联。
最新更新
python爬虫及其可视化
使用python爬取豆瓣电影短评评论内容
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
uniapp/H5 获取手机桌面壁纸 (静态壁纸)
[前端] DNS解析与优化
为什么在js中需要添加addEventListener()?
JS模块化系统
js通过Object.defineProperty() 定义和控制对象
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比