vb.net中的委托与事件

来源:互联网 发布:常用java项目技术 编辑:程序博客网 时间:2024/05/16 23:37
    委托是CTS(公共类型系统)规定的5种类型之一(类类型、结构类型、接口类型、枚举类型、委托类型)它是一种类型可以用来调用其他对象的方法,也称为函数指针。其实在vb.net中委托也可以当做是可以用来共享其他对象的方法的对象。当程序必须通过调用一个方法来执行某个操作(调用某个方法),但在编译时不知道该方法是什么时,就可以使用委托。委托允许在程序运行时指定调用的方法,委托的特点是面向对象的,类型是安全的。
委托的使用:

      首先创建一个委托:delegate {sub|function} DelegateType(参数1,参数2) 由于委托是一种类型所以在创建一个委托之后就是将它声明并实例化,第二步就是声明实例化委托并与对应方法绑定dim a as delegateType(Delegate sub),声明委托时注意它的参数类型与数量要跟创建的保持一致。第三就是用委托间接调用被委托的方法

例:

Public Class Form1Delegate Sub fr(ByVal str As String) '创建一个委托Dim a As New fr(AddressOf talk) '声明实例化委托并绑定被委托的方法:talk Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load        a.Invoke("hello")'运行指定的委托即间接调用talk方法    End SubPublic Sub talk(ByVal str As String)        MsgBox(str)    End SubEnd Class

委托在vb.net中的另一种形式:事件

       有了委托就可以透过方法来调用指定方法,这种指定不是编译时指定的而是在程序运行时指定,所以在面向对象程序设计中委托的出现可以说降低了类与类之间的耦合关系也就是实现了解耦。委托在面向对象程序中的最好应用就是事件。

       在vb.net中事件可以看成为一种特殊的委托,所以就可以将一些sub或function委托给事件,当某一方法触发事件时就会执行委托给该事件的sub或function。

vb.net中自定义事件:

Public Class Test1'自定义类        Public Event speak(ByVal str As String) '自定义事件speak    Public Sub Te(ByVal str As String) '定义触发事件函数        RaiseEvent speak(str) '触发事件    End SubEnd Class

Public Event speak(ByVal str As String)
等效于
Delegate Sub fr(ByVal str As String)Public Event speak As fr

声明事件对象并将sub或function委托给事件:

方法一:

Module Module1    Public WithEvents tea As New Test1() '声明事件对象    Public Sub talk(ByVal str As String) Handles tea.speak '将talk委托给Test类中speak事件        Console.WriteLine(str)    End Sub    Sub Main()        tea.Te("hello") '执行Test1中触发speak事件的方法    End SubEnd Module

方法二:

Module Module1    Public tea As New Test1() '声明事件对象    Public Sub talk(ByVal str As String)        Console.WriteLine(str)    End Sub    Sub Main()        AddHandler tea.speak, AddressOf talk '将talk方法委托给Test1类的speak事件        tea.Te("hello") '执行Test1中触发speak事件的方法    End SubEnd Module