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