您的位置:首页 > 数据库 > MySQL

什么是委托(Delegate)

2007-08-10 14:21 239 查看
大家都知道一个函数实现某个功能的时候往往需要一些输入的数据,但是函数本身并不知道这些数据到底是哪个具体的值,只知道这个值的数据类型,这时引入了参数,调用者调用函数的时候传入相应类型的具体值就行了。
例如:假设有一函数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
经调试的完整代码如下:
[align=left]Module Module1[/align]
[align=left]    Sub Main()[/align]
[align=left]Dim x As New Method[/align]
[align=left]        Dim ret As Integer[/align]
[align=left]        ret = x.MyFun(9, 3, AddressOf Method.Add)[/align]
[align=left]        Console.WriteLine(ret.ToString)[/align]
[align=left]    End Sub[/align]
[align=left]End Module[/align]
[align=left] [/align]
[align=left]Public Delegate Function MyMethod(ByVal x As Integer, ByVal y As Integer) As Integer[/align]
[align=left] [/align]
[align=left]Public Class Method[/align]
[align=left]    Public Shared Function Add(ByVal x As Integer, ByVal y As Integer) As Integer[/align]
[align=left]        Return x + y[/align]
[align=left]    End Function[/align]
[align=left]    Public Shared Function Subs(ByVal x As Integer, ByVal y As Integer) As Integer[/align]
[align=left]        Return x - y[/align]
[align=left]    End Function[/align]
[align=left]    Public Shared Function Mlti(ByVal x As Integer, ByVal y As Integer) As Integer[/align]
        Return x * y
[align=left]    End Function[/align]
[align=left]    Public Shared Function Devi(ByVal x As Integer, ByVal y As Integer) As Single[/align]
Return x / y ‘这儿暂不考虑除法溢出问题
[align=left]    End Function[/align]
[align=left]    Public Function MyFun(ByVal x As Integer, ByVal y As Integer, ByVal z As MyMethod) As Integer[/align]
[align=left]        Return z(x, y)[/align]
[align=left]    End Function[/align]
[align=left]End Class[/align]
 
大家应该意识到有些变化,一是调用方法时用了Addressof 方法名,这是因为方法必须传址,而默认时是传值,因此用Addressof 来求址;另一是这些方法都加了Shared一词,调用的时候用了Method.Add。这是因为现在是面向对象时代了,方法都是某个类的方法,因此调用类的方法时,要么是类的实例方法,要么是类的共享方法,这里为了方便,用了类的共享方法,因此方法前都加了Shared一词,使其成为共享方法。因此,委托实际上包含了两个因素:一个是方法,另一个是方法的对象。
 
委托传递的是 对象.方法,这就是委托。
下再附一例:
 
 
[align=left]Module Module1[/align]
[align=left] [/align]
[align=left]    Sub Main()[/align]
[align=left]        Dim 张三 As New 好人[/align]
[align=left]        张三.饿了(AddressOf 张三.方法1)[/align]
[align=left]        Dim 李四 As New 坏人[/align]
[align=left]        李四.饿了(AddressOf 李四.方法2)[/align]
[align=left]        Dim 王五 As New 坏人[/align]
[align=left]        Dim 方法3 As New 方法(AddressOf 好人.方法1)[/align]
[align=left]        王五.饿了(方法3)[/align]
[align=left]        王五.饿了(AddressOf 李四.方法2)[/align]
[align=left]        Console.ReadLine()[/align]
[align=left]    End Sub[/align]
[align=left] [/align]
[align=left]End Module[/align]
[align=left] [/align]
[align=left]Public Delegate Sub 方法(ByVal x As String)[/align]
[align=left] [/align]
[align=left] [/align]
[align=left]Public Class 人[/align]
[align=left]    Public Sub 饿了(ByVal 方法X As 方法)[/align]
[align=left]        方法X("")[/align]
[align=left]    End Sub[/align]
[align=left]End Class[/align]
[align=left] [/align]
[align=left] [/align]
[align=left]Public Class 好人[/align]
[align=left]    Inherits 人[/align]
[align=left] [/align]
[align=left]    Public Shared Sub 方法1(ByVal x As String)[/align]
[align=left]        Console.Write("买。")[/align]
[align=left]    End Sub[/align]
[align=left]End Class[/align]
[align=left] [/align]
[align=left] [/align]
[align=left]Public Class 坏人[/align]
[align=left]    Inherits 人[/align]
[align=left] Public Sub 方法2(ByVal x As String)[/align]
[align=left]        Console.Write("偷。")[/align]
[align=left] End Sub[/align]
End Class
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息