Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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
- Variazione nei delegati (Visual Basic)
- Uso della varianza per i delegati generici Func e Action (Visual Basic)