委托

引用自: 张俊峰的专栏

一、委托概念

委托是一种引用类型,表示带有特定签名和返回类型的方法。可以在该委托中封装任何匹配的方法。另外,还可以将委托看作是对方法的引用。

要使用委托,必须先声明一下。委托声明定义一种类型,他用一组特定的参数以及返回类型封装方法。对于静态方法,委托对象封装要调用的方法,对于实例方法,委托对象同时封装一个实例和该实例上的一个方法。如果我们有一个委托对象和一组适当的参数,则可以用这些参数调用该委托。

委托的一个有趣且有用的属性是,他不知道或不关心自己引用的对象的类。任何对象都可以;只是方法的参数类型和返回类型必须与委托的参数类型和返回类型相匹配。这使得委托完全适合“匿名”调用。

定义和使用委托分三个步骤:声明、实例化和调用。

二、使用委托

实例:计算两个整型变量的加减乘除运算。

定义委托:

Public Class DelegateClass

    Delegate Function Fun(ByVal x As Integer, ByVal y As Integer) As Integer

Public Shared Function Process(ByVal x As Integer, ByVal y As Integer, ByVal f As Fun) As Integer

        Dim result As Integer

        result = f(x, y)

        Return result

    End Function

End Class

定义代调用方法:

Public Class MathClass

    Public Shared Function Add(ByVal x As Integer, ByVal y As Integer) As Integer

        MessageBox.Show((x + y).ToString())

        Return x + y

    End Function

    Public Shared Function Subtract(ByVal x As Integer, ByVal y As Integer) As Integer

        Return x - y

    End Function

    Public Shared Function Multiply(ByVal x As Integer, ByVal y As Integer) As Integer

        Return x * y

    End Function

    Public Shared Function Divide(ByVal x As Integer, ByVal y As Integer) As Integer

        Return x / y

    End Function

    Public Shared Function Max(ByVal x As Integer, ByVal y As Integer) As Integer

        Return IIf(x >= y, x, y)

    End Function

    Public Shared Function Min(ByVal x As Integer, ByVal y As Integer) As Integer

        Return IIf(x <= y, x, y)

    End Function

End Class

实例化并调用委托:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

 

Dim a As Integer = Int32.Parse(TextBox1.Text)

Dim b As Integer = Int32.Parse(TextBox3.Text)

Dim output As Integer = 0

 

'DelegateClass.Fun(c)= New DelegateClass.Fun(AddressOf MathClass.Max))

Dim c As DelegateClass.Fun = New DelegateClass.Fun(AddressOf MathClass.Max)

Dim q As Integer = c(8, 9)

 

Select Case TextBox2.Text

Case "+"

output = DelegateClass.Process(a, b, New DelegateClass.Fun(AddressOf MathClass.Add))

Case "-"

output=DelegateClass.Process(a, b, New DelegateClass.Fun(AddressOf MathClass.Subtract))

Case "*"

output=DelegateClass.Process(a,b,NewDelegateClass.Fun(AddressOf MathClass.Multiply))

Case "/"

output = DelegateClass.Process(a, b, New DelegateClass.Fun(AddressOf MathClass.Divide))

Case "max"

output = DelegateClass.Process(a, b, New DelegateClass.Fun(AddressOf MathClass.Max))

Case "min"

output = DelegateClass.Process(a, b, New DelegateClass.Fun(AddressOf MathClass.Min))

End Select

TextBox4.Text = output

End Sub

三、组合委托

VB.NET中,委托为多路广播,这意味着它们可以同时指向多个方法。多路广播委托维护一个在调用该委托时将全部被调用的函数列表。可以使用委托对象的Combine方法合并两个委托,又可以使用委托对象的Remove方法从多路广播委托中移去一个委托。

需要注意:只可以组合相同类型的委托,并且委托类型必须具有Void返回值。若不是Void类型返回值,则返回值是最后一个被调用的委托的返回值。

posted on 2005-12-09 09:53  小肠与小豆子  阅读(359)  评论(0)    收藏  举报

导航