Dela via


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:

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

Se även