魔扣论坛

魔扣源码论坛业务
查看: 962|回复: 5

VB.net的Override事件处理程序

[复制链接]
  • TA的每日心情
    难过
    2018-10-11 00:05
  • 签到天数: 6 天

    [LV.2]随便看看

    154

    主题

    3

    回帖

    268

    积分

    中级魔扣

    Rank: 3Rank: 3

    魔扣币
    229
    贡献
    93
    威望
    16
    发表于 2016-12-31 15:48:28 | 显示全部楼层 |阅读模式
    魔扣币兑换比例:【 50以下 : ¥1 = 10 魔扣币 】丨【 50 - 100 :¥1 = 20 魔扣币】丨【 100以上:¥1 = 30 魔扣币 】

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?立即注册

    x
    介绍
    在类或控件的继承中,子类或子控件封装了父类的所有函数,其中包括事件处理程序。本文将着重讨论在 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 子句关联事件处理程序时就要格外小心,以免发生重复关联。

    该用户从未签到

    1

    主题

    267

    回帖

    535

    积分

    高级魔扣

    Rank: 4

    魔扣币
    267
    贡献
    267
    威望
    0
    发表于 2017-2-16 05:04:42 | 显示全部楼层
    鼎力支持!!

    该用户从未签到

    0

    主题

    245

    回帖

    490

    积分

    中级魔扣

    Rank: 3Rank: 3

    魔扣币
    245
    贡献
    245
    威望
    0
    发表于 2017-5-23 20:51:33 | 显示全部楼层
    真诚的朋友虽然遥远还是心绪相牵!纯真的友谊即是难聚仍然温馨美甜!魔扣源码论坛祝福好朋友事事顺心如意快乐天天!远方的我时时为您衷心的祈祷祝愿!

    该用户从未签到

    0

    主题

    263

    回帖

    526

    积分

    高级魔扣

    Rank: 4

    魔扣币
    263
    贡献
    263
    威望
    0
    发表于 2017-10-4 22:13:04 | 显示全部楼层
    不知不觉,是这世上最可怕的力量。',

    该用户从未签到

    3

    主题

    253

    回帖

    510

    积分

    高级魔扣

    Rank: 4

    魔扣币
    254
    贡献
    254
    威望
    0
    发表于 2018-3-21 14:40:47 | 显示全部楼层
    魔扣源码论坛谢谢朋友的精彩点评!谢谢您一直以来的支持和鼓励!您的每一次点评,哪怕是一个小图、几句短语,都让我激动万分,温暖全身!感谢网络为我们搭建了交流平台,架起一座交友金桥!让我们相识网络、从陌生到熟悉、到相识相知,成为好朋友。愿我们的友谊今世永存!

    该用户从未签到

    3

    主题

    275

    回帖

    553

    积分

    高级魔扣

    Rank: 4

    魔扣币
    275
    贡献
    275
    威望
    0
    发表于 2018-9-23 13:06:16 | 显示全部楼层
    每棵大树,都曾只是一粒种子。',
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    • 联系我们
    • 新浪微博 :
    • 在线客服 :魔扣科技 
    • 源码QQ群 :魔扣源码论坛官方总群
    • 联系邮箱 :charlin#morko.net
    • 微信扫一扫
    快速回复 返回顶部 返回列表