Använda varians i ombud (Visual Basic)
När du tilldelar en metod till ett ombud ger samvarians och kontravarians flexibilitet för att matcha en delegattyp med en metodsignatur. Med kovarians kan en metod ha en returtyp som är mer härledd än den som definierats i ombudet. Contravariance tillåter en metod som har parametertyper som är mindre härledda än de i ombudstypen.
Exempel 1: Kovarians
beskrivning
Det här exemplet visar hur ombud kan användas med metoder som har returtyper som härleds från returtypen i delegatsignaturen. Datatypen som returneras av DogsHandler
är av typen Dogs
, som härleds från den Mammals
typ som definieras i ombudet.
Kod
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
Exempel 2: Kontravarians
beskrivning
Det här exemplet visar hur ombud kan användas med metoder som har parametrar vars typer är bastyper av parametertypen ombudssignatur. Med kontravarians kan du använda en händelsehanterare i stället för separata hanterare. I följande exempel används två ombud:
Ett KeyEventHandler ombud som definierar signaturen för händelsen Button.KeyDown . Dess signatur är:
Public Delegate Sub KeyEventHandler(sender As Object, e As KeyEventArgs)
Ett MouseEventHandler ombud som definierar signaturen för händelsen Button.MouseClick . Dess signatur är:
Public Delegate Sub MouseEventHandler(sender As Object, e As MouseEventArgs)
Exemplet definierar en händelsehanterare med en EventArgs parameter och använder den för att hantera både Button.KeyDown
händelserna och Button.MouseClick
. Det kan göra detta eftersom EventArgs är en bastyp för både KeyEventArgs och MouseEventArgs.
Code
' 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