Variantie gebruiken in gemachtigden (Visual Basic)
Wanneer u een methode toewijst aan een gemachtigde, bieden covariantie en contravariantie flexibiliteit voor het koppelen van een gedelegeerdetype aan een methodehandtekening. Met covariantie kan een methode een retourtype hebben dat meer is afgeleid dan dat is gedefinieerd in de gemachtigde. Contravariantie staat een methode toe die parametertypen bevat die minder zijn afgeleid dan die in het type gemachtigde.
Voorbeeld 1: Covariantie
Beschrijving
In dit voorbeeld ziet u hoe gemachtigden kunnen worden gebruikt met methoden die retourtypen hebben die zijn afgeleid van het retourtype in de handtekening voor gemachtigden. Het gegevenstype dat wordt geretourneerd door DogsHandler
is van het type Dogs
, dat is afgeleid van het Mammals
type dat is gedefinieerd in de gemachtigde.
Code
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
Voorbeeld 2: Contravariantie
Beschrijving
In dit voorbeeld ziet u hoe gemachtigden kunnen worden gebruikt met methoden met parameters waarvan de typen basistypen zijn van het parametertype voor de gedelegeerde handtekening. Met contravariantie kunt u één gebeurtenishandler gebruiken in plaats van afzonderlijke handlers. In het volgende voorbeeld worden twee gemachtigden gebruikt:
Een KeyEventHandler gemachtigde die de handtekening van de gebeurtenis Button.KeyDown definieert. De handtekening is:
Public Delegate Sub KeyEventHandler(sender As Object, e As KeyEventArgs)
Een MouseEventHandler gemachtigde die de handtekening van de gebeurtenis Button.MouseClick definieert. De handtekening is:
Public Delegate Sub MouseEventHandler(sender As Object, e As MouseEventArgs)
Het voorbeeld definieert een gebeurtenis-handler met een EventArgs parameter en gebruikt deze om zowel de als Button.MouseClick
de Button.KeyDown
gebeurtenissen te verwerken. Dit kan omdat EventArgs het een basistype is van zowel als KeyEventArgsMouseEventArgs.
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