VB.NET下的事件和委托

本文依然给大家介绍事件和委托,只不过这次介绍的是VB.NET中的事件和委托。希望对大家有帮助,一起来看。

AD:


    委托是可用于调用其他对象方法的对象。它们有时被称为类型安全函数指针,因为它们与其他编程语言中所使用的函数指针相似。但不同于函数指针,VB.NET 委托是基于 System.Delegate 类的引用类型,它可以引用共享方法—无需特定的类实例即可调用的方法和实例方法。

    委托在调用过程和被调用过程需要媒介的情况下是很有用的。例如,您可能想让一个引发事件的对象能够在不同的环境下调用不同的事件处理程序。不幸的是,引发事件的对象无法提前知道处理特定事件的事件处理程序。Visual Basic .NET 通过在使用 AddHandler 语句时创建委托,可让您动态地将事件处理程序与事件关联。在运行时,委托将各种调用转发到相应的事件处理程序。

    尽管可以创建自己的委托,但在大多数情况下,Visual Basic .NET 为您创建委托并提供具体信息。例如,Event 语句将名为 <EventName>EventHandler 的委托类隐式定义为 Event 语句所在类的嵌套类,且其签字与该事件相同。AddressOf 语句则隐式创建委托的实例。例如,以下两行代码是等效的:

       
       
    1. AddHandler Button1.Click    
    2. AddressOf Me.Button1_Click   
    3. ' AddHandler 指向引发事件的对象,AddressOf则确定该事件对象所要调用的事件处理程序  
    4. '上述行为又可以称为 监视  
    5. AddHandler Button1.Click, New EventHandler(AddressOf Button1_Click)  

    只要编译器可以用上下文确定委托的类型,就可以使用速写方法创建委托。

    注:处理自基类继承的事件

    派生类(继承某个基类特征的类)能用 Handles MyBase 语句处理它们的基类所引发的事件。

    处理来自基类的事件

    通过给事件处理程序过程的声明行添加 Handles MyBase.<event name> 语句来声明派生类中的事件处理程序,其中的 event name 是基类中正在处理的事件的名称。例如:

       
       
    1. Public Class Class1  
    2. Public Event SE(ByVal i As Integer)  
    3. ' Place methods and properties here.  
    4. End Class 
    5.  
    6. Public Class Class2  
    7. Inherits Class1  
    8. Sub EventHandler(ByVal x As IntegerHandles MyBase.SE  
    9. ' Place code to handle events from Class1 here.  
    10. End Sub 
    11. End Class 

    声明使用现有委托类型的事件

    某些情况下,可能会要声明某事件使用现有委托类型为基础委托。以下语法说明了进行声明的方式:

    Event AnEvent As DelegateType该语法在将多个事件路由到同一处理程序时是很有用的,不过使用现有委托类型时需要先进行如下定义:

       
       
    1. delegate {sub|function} DelegateType(参数1,参数2) 

    下面是vb.net控制台程序演示单一事件委托多处理程序.

    比如说在社会上,你是法律,社会上有三种人,警察、无赖和自愿反扒队。

    你规定:如果小偷偷东西,则警察处罚小偷500元钱,自愿反扒队要打无赖进医院一次

    这就是现实中的委托。

    实际上,在写程序中,程序员就是法律,警察、小偷和自愿反扒队就是三个对象。小偷偷东西是一个方法,小偷还有一个偷东西事件,他偷东西激发这个事件。而警察和自愿反扒队就是两个事件处理对象,警察负责把小偷的钱扣除500,自愿反扒队需要大小偷进医院一次。

    所以,委托有如下几个要素:

    • 激发事件的对象--就是小偷
    • 处理对象事件的对象--就是警察和自愿反扒队
    • 定义委托,就是法律让警察和自愿反扒队监视小偷。

    如果这三个要素都满足的话,则你就写出了一个完整事件的处理。

    下面是vb.net控制台的实例

       
       
    1. Imports System  
    2. Module Module1  
    3.  
    4. '准备引用 无赖 类的偷东西事件  
    5. Public WithEvents w As 无赖  
    6. Sub Main()  
    7. Console.WriteLine("新的一天开始了....")  
    8. ' 实例华警察、无赖、自愿反扒队 类  
    9. Dim p As New 警察  
    10. w = New 无赖  
    11. Dim pp As New 自愿反扒队  
    12. '设置对无赖类的偷东西事件的监视,并设置相应的事件处理程序  
    13. '如果小偷玩偷东西则引用警察的罚钱处理程序  
    14. AddHandler w.PlayGame, AddressOf p.扣钱  
    15. '如果小偷偷东西则引用自愿反扒队的打人处理程序  
    16. AddHandler w.PlayGame, AddressOf pp.打人  
    17. w.偷东西()  
    18. Console.WriteLine("天黑了....")  
    19. Console.ReadLine()  
    20. End Sub 
    21. 'End Class  
    22.  
    23. Public Class 警察  
    24. Sub New()  
    25. Console.WriteLine("生成警察......")  
    26. End Sub 
    27. '定义的事件处理程序的参数类型要与定义的委托的参数类型相一致  
    28. Public Sub 扣钱(ByVal sender As ObjectByVal e As System.EventArgs)  
    29.  
    30. Console.WriteLine("警察:好小子,胆敢偷东西...")  
    31. '定义线程输出迟缓3秒  
    32. System.Threading.Thread.Sleep(3000)  
    33. Console.WriteLine("警察:看看你小子有多少钱...")  
    34. Dim f As 无赖 = sender  
    35. System.Threading.Thread.Sleep(3000)  
    36. Console.WriteLine("无赖 的钱: " + f.钱.ToString())  
    37. System.Threading.Thread.Sleep(3000)  
    38. Console.WriteLine("开始扣钱......")  
    39. System.Threading.Thread.Sleep(3000)  
    40. f.钱 = f.钱 - 500  
    41. Console.WriteLine("扣完了....现在无赖 还剩下:" + f.钱.ToString())  
    42. System.Threading.Thread.Sleep(3000)  
    43. End Sub 
    44.  
    45. End Class 
    46. Public Class 无赖  
    47. '先定义一个偷东西的事件使用现有委托类型 PlayGameHandler为基础委托  
    48. Public Event PlayGame As PlayGameHandler  
    49. Private m_Money As Integer 
    50. Private ey As Integer 
    51. Sub New()  
    52. Console.WriteLine("生成无赖....")  
    53. m_Money = 1000  
    54. ey = 5  
    55. End Sub 
    56. '定义挨打属性用来记录挨打过几次  
    57. Property 挨打() As Integer 
    58. Get 
    59. Return ey  
    60. End Get 
    61. Set(ByVal Value As Integer)  
    62. ey = Value  
    63. End Set 
    64. End Property 
    65. '定义前属性用来记录有多少钱  
    66. Property 钱() As Integer 
    67. Get 
    68. Return m_Money  
    69. End Get 
    70. Set(ByVal Value As Integer)  
    71. m_Money = Value  
    72. End Set 
    73. End Property 
    74. '定义偷东西过程  
    75. Public Sub 偷东西()  
    76. Console.WriteLine("无赖开始偷东西了")  
    77. System.Threading.Thread.Sleep(3000)  
    78. '实例化事件参数  
    79. Dim e As New System.EventArgs  
    80. '引发偷东西事件,参数类型要与现有委托类型一致  
    81. RaiseEvent PlayGame(Me, e)  
    82. End Sub 
    83. End Class 
    84. Public Class 自愿反扒队  
    85. Sub New()  
    86. Console.WriteLine("自愿反扒队来了.....")  
    87. System.Threading.Thread.Sleep(3000)  
    88. End Sub 
    89. '定义的事件处理程序的参数类型要与定义的委托的参数类型相一致  
    90. Public Sub 打人(ByVal sender As ObjectByVal e As System.EventArgs)  
    91. System.Threading.Thread.Sleep(3000)  
    92. Console.WriteLine("自愿反扒队:好小子,敢偷东西...")  
    93. System.Threading.Thread.Sleep(3000)  
    94. Console.WriteLine("自愿反扒队:你小子挨过几次打了...")  
    95. Dim bn As 无赖 = sender  
    96. System.Threading.Thread.Sleep(3000)  
    97. Console.WriteLine("无赖:" + bn.挨打.ToString + "次")  
    98. System.Threading.Thread.Sleep(3000)  
    99.  
    100. Console.WriteLine("自愿反扒队:那也得揍你,先来一拳.... ")  
    101. System.Threading.Thread.Sleep(3000)  
    102. Console.WriteLine("自愿反扒队:再来一脚......")  
    103. System.Threading.Thread.Sleep(3000)  
    104.  
    105. Console.WriteLine("自愿反扒队:打完了...赶紧去医院吧...")  
    106. End Sub 
    107. End Class 
    108. '定义委托类型  
    109. Delegate Sub PlayGameHandler(ByVal sender As ObjectByVal e As System.EventArgs)  
    110. End Module 
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值