Condividi tramite


Utilizzo della varianza con i delegati (Visual Basic)

Quando si assegna un metodo a un delegato, la covarianza e la controvarianza offrono flessibilità per la corrispondenza di un tipo delegato con una firma del metodo. Covarianza consente a un metodo di avere un tipo restituito più derivato di quello definito nel delegato. La controvarianza consente un metodo con tipi di parametro meno derivati rispetto a quelli nel tipo delegato.

Esempio 1: Covarianza

Descrizione

In questo esempio viene illustrato come usare i delegati con metodi che dispongono di tipi restituiti derivati dal tipo restituito nella firma del delegato. Il tipo di dati restituito da DogsHandler è di tipo Dogs, che deriva dal Mammals tipo definito nel delegato.

Codice

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

Esempio 2: Controvarianza

Descrizione

In questo esempio viene illustrato come usare i delegati con metodi con parametri i cui tipi sono tipi di base del tipo di parametro della firma del delegato. Con la controvarianza, è possibile usare un gestore di eventi anziché gestori separati. L'esempio seguente usa due delegati:

  • Delegato KeyEventHandler che definisce la firma dell'evento Button.KeyDown . La firma è:

    Public Delegate Sub KeyEventHandler(sender As Object, e As KeyEventArgs)
    
  • Delegato MouseEventHandler che definisce la firma dell'evento Button.MouseClick . La firma è:

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

L'esempio definisce un gestore eventi con un EventArgs parametro e lo usa per gestire gli Button.KeyDown eventi e Button.MouseClick . Questa operazione può essere eseguita perché EventArgs è un tipo di base sia di KeyEventArgs sia di MouseEventArgs.

Codice

' 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

Vedere anche