使用委托中的变体 (Visual Basic)

将方法分配给委托时, 协变逆变 为使用方法签名匹配委托类型提供了灵活性。 协变允许方法具有的派生返回类型多于委托中定义的类型。 逆变允许方法具有的派生参数类型少于委托类型中的类型。

示例 1:协变

DESCRIPTION

本示例演示如何将委托与具有返回类型的方法一起使用,这些返回类型派生自委托签名中的返回类型。 返回的 DogsHandler 数据类型是 Dogs,该类型派生自委托中定义的 Mammals 类型。

代码

Class Mammals
End Class

Class Dogs
    Inherits Mammals
End Class
Class Test
    Public Delegate Function HandlerMethod() As Mammals
    Public Shared Function MammalsHandler() As Mammals
        Return Nothing
    End Function
    Public Shared Function DogsHandler() As Dogs
        Return Nothing
    End Function
    Sub Test()
        Dim handlerMammals As HandlerMethod = AddressOf MammalsHandler
        ' Covariance enables this assignment.
        Dim handlerDogs As HandlerMethod = AddressOf DogsHandler
    End Sub
End Class

示例 2:逆变

DESCRIPTION

本示例演示如何将委托与具有参数的方法一起使用,这些参数的类型是委托签名参数类型的基类型。 通过逆变可以使用一个事件处理程序而不是多个单独的处理程序。 下面的示例使用两个委托:

  • 定义 KeyEventHandler 事件签名的 委托。 其签名为:

    Public Delegate Sub KeyEventHandler(sender As Object, e As KeyEventArgs)
    
  • 定义 MouseEventHandler 事件签名的 委托。 其签名为:

    Public Delegate Sub MouseEventHandler(sender As Object, e As MouseEventArgs)
    

该示例使用参数定义事件处理程序 EventArgs ,并使用它来处理 Button.KeyDownButton.MouseClick 事件。 它可以实现这一点,因为EventArgsKeyEventArgsMouseEventArgs的基本类型。

代码

' Event handler that accepts a parameter of the EventArgs type.
Private Sub MultiHandler(ByVal sender As Object,
                         ByVal e As System.EventArgs)
    Label1.Text = DateTime.Now
End Sub

Private Sub Form1_Load(ByVal sender As System.Object,
    ByVal e As System.EventArgs) Handles MyBase.Load

    ' You can use a method that has an EventArgs parameter,
    ' although the event expects the KeyEventArgs parameter.
    AddHandler Button1.KeyDown, AddressOf MultiHandler

    ' You can use the same method
    ' for the event that expects the MouseEventArgs parameter.
    AddHandler Button1.MouseClick, AddressOf MultiHandler
End Sub

另请参阅