Delen via


Gebruik van variantie bij delegaten (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 returntype hebben dat meer afgeleid is dan dat in de delegate is gedefinieerd. Contravariantie staat een methode toe waarvan de parametertypen minder afgeleid zijn dan die in het delegate type.

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 delegate die de signatuur van de gebeurtenis Button.KeyDown definieert. De handtekening is:

    Public Delegate Sub KeyEventHandler(sender As Object, e As KeyEventArgs)
    
  • Een MouseEventHandler gedelegeerde die de signatuur van het Button.MouseClick evenement definieert. De handtekening is:

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

Het voorbeeld definieert een eventhandler met een EventArgs parameter en gebruikt deze om zowel de Button.KeyDown als de Button.MouseClick gebeurtenissen te verwerken. Dit kan omdat EventArgs een basistype is van zowel KeyEventArgs als 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

Zie ook