关键词搜索

源码搜索 ×
×

VB.NET委托

发布2022-06-04浏览899次

详情内容

'警察抓小偷()
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 偷东西事件vb.net教程数)
            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博客,转载请标明出处:委托的理解 (抓小偷_qisir1981的博客-CSDN博客

委托和事件
 
委托,这个词一听被邪乎。几年前我还以为和律师什么的有关系。可事实上“委托”就是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

相关技术文章

点击QQ咨询
开通会员
返回顶部
×
微信扫码支付
微信扫码支付
确定支付下载
请使用微信描二维码支付
×

提示信息

×

选择支付方式

  • 微信支付
  • 支付宝付款
确定支付下载