Condividi tramite


Uso della varianza nei delegati (Visual Basic)

Quando si assegna un metodo a un delegato, covarianza e controvarianza offrono flessibilità per la corrispondenza di un tipo delegato con una firma di metodo. La 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 del tipo delegato.

Esempio 1: covarianza

Descrizione

In questo esempio viene illustrato in che modo si possono usare i delegati con i metodi che hanno tipi restituiti derivati dal tipo restituito nella firma del delegato. Il tipo di dati restituito da DogsHandler è di tipo Dogs, che deriva dal tipo Mammals 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 in che modo si possono usare i delegati con i metodi che hanno parametri i cui tipi rappresentano tipi di base del tipo di parametro della firma del delegato. Con la controvarianza è possibile usare un solo gestore eventi anziché gestori separati. Nell'esempio seguente vengono usati due delegati:

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

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

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

Nell'esempio viene definito un gestore eventi con un parametro EventArgs e viene usato per gestire entrambi gli eventi Button.KeyDown e Button.MouseClick. Ciò è possibile perché EventArgs è un tipo di base sia di KeyEventArgs che 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

Vedi anche