Dela via


Använda varians i delegeringar (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. Contravarians tillåter en metod som har parametertyper som är mindre specifika än de i delegattypen.

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:

  • En KeyEventHandler delegat som definierar signaturen för Button.KeyDown händelsen. Dess signatur är:

    Public Delegate Sub KeyEventHandler(sender As Object, e As KeyEventArgs)
    
  • En MouseEventHandler delegat som definierar signaturen för Button.MouseClick-händelsen. 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.

Kod

' 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

Se även