-
VB.NET委托
‘'警察抓小偷()
Module Module1
'事件委托
Public Delegate Sub 抓小偷事件(ByVal sender As 小偷, ByVal e As 偷东西事件参数)
'事件参数
Public Class 偷东西事件参数
Inherits System.EventArgs
Public 偷的东西 As String
Public 偷的地点 As String
Public 被偷的人 As String
End Class
'警察类
Public Class 警察
Public Sub New()
Console.WriteLine("生成警察。。。")
Console.WriteLine()
End Sub
Public Sub 抓小偷(ByVal sender As 小偷, ByVal e As 偷东西事件参数)
Console.WriteLine()
Console.WriteLine("警察:小毛贼,哪里跑,。。。")
Console.WriteLine("(小偷被抓。)")
Console.WriteLine()
Console.WriteLine("警察:什么名字?")
Console.WriteLine("小偷:" & sender.姓名)
Console.WriteLine("警察:偷了什么?")
Console.WriteLine("小偷:" & e.偷的东西)
Console.WriteLine("警察:在哪里偷的?")
Console.WriteLine("小偷:" & e.偷的地点)
Console.WriteLine("警察:偷了谁的?")
Console.WriteLine("小偷:" & e.被偷的人)
Console.WriteLine("警察:蹲局子去!100天。")
Console.WriteLine()
End Sub
End Class
'小偷类
Public Class 小偷
Private _姓名 As String
Public Property 姓名() As String
Get
Return _姓名
End Get
Set(ByVal Value As String)
_姓名 = Value
End Set
End Property
Public Sub New(ByVal 姓名 As String)
Console.WriteLine("生成小偷。。。" & "(" & 姓名 & ")")
Me.姓名 = 姓名
Console.WriteLine()
End Sub
Public Event 警察抓小偷事件 As 抓小偷事件
Public Sub 偷东西(ByVal 偷的东西 As String, ByVal 偷的地点 As String, ByVal 被偷的人 As String)
Console.WriteLine("小偷:哈哈。。。今天偷了" & 偷的东西)
Console.WriteLine("(小偷正在暗喜,欲溜。。。。)")
Console.WriteLine()
Dim e As New 偷东西事件参数
e.偷的东西 = 偷的东西
e.偷的地点 = 偷的地点
e.被偷的人 = 被偷的人
RaiseEvent 警察抓小偷事件(Me, e) '偷东西激发警察抓小偷事件
End Sub
End Class
'主程序
Sub Main()
Dim 张三 As 小偷 = New 小偷("张三")
Dim 李四 As New 警察
Console.WriteLine("公交车上,人很多,警察小偷都有,。。。(有好戏看了)。")
'警察开始监视小偷,若偷即抓
AddHandler 张三.警察抓小偷事件, AddressOf 李四.抓小偷
张三.偷东西("一部手机。", "公交车上。", "一名女士。")
Console.ReadLine()
End Sub
End Module
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/qisir1981/archive/2006/07/27/988494.aspx
委托和事件
委托,这个词一听被邪乎。几年前我还以为和律师什么的有关系。可事实上“委托”就是System.Delegate类。它是一个类,这就意味着它是一个数据类型,而且是一个引用类型。它能够引用对象的方法(实例方法)和类的方法(静态方法、在VB里的Shared方法)。
使用委托可以概括为三步:声明、实例化、调用。
Public Class Class1
Shared Sub Main()
Dim cls2 As New Class2
'实例化
Dim d1 As OneDelegate = AddressOf cls2.fun1
'调用
d1() '实际上执行fun1
'实例化
Dim d2 As OneDelegate = AddressOf Class2.fun2
'调用
d2() '实际上执行fun2
Console.ReadLine()
End Sub
End Class
'声明委托
Delegate Sub OneDelegate()
Public Class Class2
'实例方法
Public Sub fun1()
Console.WriteLine("fun1")
End Sub
'shared方法
Public Shared Sub fun2()
Console.WriteLine("fun2")
End Sub
End Class
这样直接调用委托没有什么意义。因为可以直接调用方法。那样更加简单。使用委托最多的其实是事件,因为事件是由委托实现的。现如今大多数程序都是事件驱动的。要使用事件必须正确作如下几件事:
声明事件
引发事件
编写事件处理程序
把时间处理程序和事件联系起来
声明事件
通常我们都是在编写某一个类的时候把事件添加给类。请看下面这段代码:
Public Class class3
'该类具有一个属性Prop。当该属性发生改变之后引发事件PropChanged
'添加事件PropChanged
Public Event PropChanged()
'把事件添加给一个类,指定该类可以引发该事件。
'要引发事件必须使用RaisEvent,就像下面这样。(在属性的set里面)
'注意:使用事件必须注意,事件不能具有返回值、可选参数、ParamArray参数。
Private _prop As String
'参数Prop
Public Property Prop() As String
Get
Return Me._prop
End Get
Set(ByVal Value As String)
Me._prop = Value
'当这个参数发生改变之后触发事件PropChanged
RaiseEvent PropChanged()
'这样事件就发生了。但是让这个事件发生绝对不是
'最终的目的。人们使用事件机制,是为了在事件发生
'的时候做点什么事情。所以,必须再使用这个类的
'程序里写一个函数作为事件处理程序。
'就像Class1.cls3_PropChanged(那样)
End Set
End Property
End Class
Public Class Class1
Shared Sub Main()
Dim cls2 As New Class2
'实例化
Dim d1 As OneDelegate = AddressOf cls2.fun1
'调用
d1() '实际上执行fun1
'实例化
Dim d2 As OneDelegate = AddressOf Class2.fun2
'调用
d2() '实际上执行fun2
Dim cls1 As New Class1
cls1.TestEvent()
Console.ReadLine()
End Sub
'声明class3对象
Private cls3 As class3
'事件处理程序。准备用来处理对象cls3的PropChanged事件。
'就是说,当对象cls3.Prop被改变之后,这个函数被执行。
'这就需要把事件处理程序,也就是这个方法,和事件联系起来。
'然后再为cls3.Prop赋值。就像TestEvent方法所作的那样。
Private Sub cls3_PropChanged()
'把事件和事件处理程序分开
RemoveHandler cls3.PropChanged, _
AddressOf Me.cls3_PropChanged
Console.WriteLine("cls3_PropChanged被执行")
End Sub
Private Sub TestEvent()
Me.cls3 = New class3
'把事件处理程序和事件联系起来。
AddHandler cls3.PropChanged, AddressOf Me.cls3_PropChanged
'注意:
'还有另一种把事件和事件处理程序联系起来的方法,
'就是使用WithEvents和Handles。非常常见,所以不详述。
'为属性赋值
Me.cls3.Prop = "改变属性"
'事件这时就发生了,事件处理程序被执行。
End Sub
End Class
'声明委托
Delegate Sub OneDelegate()
Public Class Class2
'实例方法
Public Sub fun1()
Console.WriteLine("fun1")
End Sub
'shared方法
Public Shared Sub fun2()
Console.WriteLine("fun2")
End Sub
End Class
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/qisir1981/archive/2006/07/27/988514.aspx