共用方式為


使用委派中的變異數 (Visual Basic)

當您將方法指派給委派時,「共變數」和「反變數」可讓您彈性地比對委派類型和方法簽章。 共變數允許某個方法的傳回型別與定義於委派中的傳回型別相比,其衍生程度較大。 反變數允許某個方法的參數類型與委派類型中的參數類型相比,其衍生程度較小。

範例 1︰共變數

描述

此範例示範如何搭配其傳回型別衍生自委派簽章中傳回型別的方法使用委派。 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:反變數

描述

此範例示範如何搭配其參數類型為委派簽章參數類型的基底類型方法來使用委派。 透過反變數,您可以使用一個事件處理常式,而不是不同的處理常式。 下列範例會使用兩個委派:

  • KeyEventHandler 委派會定義 Button.KeyDown 事件的簽章。 其簽章為:

    Public Delegate Sub KeyEventHandler(sender As Object, e As KeyEventArgs)
    
  • MouseEventHandler 委派會定義 Button.MouseClick 事件的簽章。 其簽章為:

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

此範例以 EventArgs 參數定義事件處理常式,然後使用它來處理 Button.KeyDownButton.MouseClick 事件。 因為 EventArgs 同時是 KeyEventArgsMouseEventArgs 的基底類型,所以可以這麼做。

程式碼

' 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

另請參閱