什么是委托(Delegate)

大家都知道一个函数实现某个功能的时候往往需要一些输入的数据,但是函数本身并不知道这些数据到底是哪个具体的值,只知道这个值的数据类型,这时引入了参数,调用者调用函数的时候传入相应类型的具体值就行了。
例如:假设有一函数MySqr()
MySqr(5)返回5的平方25;
MySqr(6)返回6的平方36;
如果要返回任意整数x的平方x^2, 函数本身并不知道x到底是哪个具体的值,但是一整数,通常我们会给这个函数引进参数,如:
Public Function MySql(Byval x as Integer) As Integer
 Return x*x
End Sub
这里的x实际上就可以看作一种委托(或代理),用x代表任意一个整数。
 
假设有另外一个函数MyFun(),功能是对两数进行操作;
MyFun(5,6,add(5,6))返回5和6 相加的结果;
MyFun(50,6,Subs(50,6))返回50和6 相减的结果;
MyFun(6,9,Mult(6,9))返回6和9 相乘的结果;
MyFun(9,6,Devi(9,6))返回9和6 相除的结果;
如果要返回任意整数x和y 的任意操作(以上四种),那么我们会给这个函数引进参数,当然前两个参数没问题,Byval x as Integer,Byval y as Integer,第三个参数是一种方法,该让第三个参数变量as 为什么类型呢?即:MyFun(Byval x as Integer,Byval y as Integer,Byval z as ???).
 
这里的z实际上也就可以看作是一种委托(或代理),用z代表任意一个方法。那么z该为什么类型呢?
它不是整型,也不是实型,它是一种方法,但没有方法型,给它起个新名字,叫委托(型)。
于是我们这样处理:
Public Delegate Function MyMethod(Byval x as Integer,Byval y as Integer) As Integer
我们定义了一个委托,实际上就是一种方法型,这种方法型要求必须有两个整形参数,它代表能对这两个整形参数操作的任意方法。这个委托定义的同时,也有了一种约定,它所代表的这方法也必须有两个整形参数,返回值也必须是整形,否则不能代表。
下面我们定义四个方法,这四个方法都符合委托要求:
Public Function Add(Byval x as Integer,Byval y as Integer) as Integer
Return x+y
End Sub
Public Function Subs(Byval x as Integer,Byval y as Integer) as Integer
Return x-y
End Sub
Public Function Mlti(Byval x as Integer,Byval y as Integer) as Integer
Return x*y
End Sub
Public Function Devi(Byval x as Integer,Byval y as Integer) as Integer
Return x/y ‘这儿暂不考虑除法溢出问题
End Sub
我们给这个函数引进参数的形式就会如下:
 
Public Function MyFun(Byval x as Integer,Byval y as Integer,Byval z As Mymethod) as Integer
 Return z(x,y)
End Sub
经调试的完整代码如下:
Module Module1
    Sub Main()
Dim x As New Method
        Dim ret As Integer
        ret = x.MyFun(9, 3, AddressOf Method.Add)
        Console.WriteLine(ret.ToString)
    End Sub
End Module
 
Public Delegate Function MyMethod(ByVal x As Integer, ByVal y As Integer) As Integer
 
Public Class Method
    Public Shared Function Add(ByVal x As Integer, ByVal y As Integer) As Integer
        Return x + y
    End Function
    Public Shared Function Subs(ByVal x As Integer, ByVal y As Integer) As Integer
        Return x - y
    End Function
    Public Shared Function Mlti(ByVal x As Integer, ByVal y As Integer) As Integer
        Return x * y
    End Function
    Public Shared Function Devi(ByVal x As Integer, ByVal y As Integer) As Single
Return x / y ‘这儿暂不考虑除法溢出问题
    End Function
    Public Function MyFun(ByVal x As Integer, ByVal y As Integer, ByVal z As MyMethod) As Integer
        Return z(x, y)
    End Function
End Class
 
大家应该意识到有些变化,一是调用方法时用了Addressof 方法名,这是因为方法必须传址,而默认时是传值,因此用Addressof 来求址;另一是这些方法都加了 Shared 一词,调用的时候用了 Method.Add。 这是因为现在是面向对象时代了,方法都是某个类的方法,因此调用类的方法时,要么是类的实例方法,要么是类的共享方法,这里为了方便,用了类的共享方法,因此方法前都加了 Shared 一词,使其成为共享方法。因此,委托实际上包含了两个因素:一个是方法,另一个是方法的对象。
 
委托传递的是 对象.方法,这就是委托。
下再附一例:
 
 
Module Module1
 
    Sub Main()
        Dim 张三 As New 好人
        张三.饿了(AddressOf 张三.方法1)
        Dim 李四 As New 坏人
        李四.饿了(AddressOf 李四.方法2)
        Dim 王五 As New 坏人
        Dim 方法3 As New 方法(AddressOf 好人.方法1)
        王五.饿了(方法3)
        王五.饿了(AddressOf 李四.方法2)
        Console.ReadLine()
    End Sub
 
End Module
 
Public Delegate Sub 方法(ByVal x As String)
 
 
Public Class
    Public Sub 饿了(ByVal 方法X As 方法)
        方法X("")
    End Sub
End Class
 
 
Public Class 好人
    Inherits
 
    Public Shared Sub 方法1(ByVal x As String)
        Console.Write("买。")
    End Sub
End Class
 
 
Public Class 坏人
    Inherits
 Public Sub 方法2(ByVal x As String)
        Console.Write("偷。")
 End Sub
End Class
 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值