Usar la varianza en delegados (Visual Basic)Using Variance in Delegates (Visual Basic)

Al asignar un método a un delegado, la covarianza y la contravarianza proporcionan flexibilidad para hacer coincidir un tipo de delegado con una firma de método.When you assign a method to a delegate, covariance and contravariance provide flexibility for matching a delegate type with a method signature. La covarianza permite que un método tenga un tipo de valor devuelto más derivado que el definido en el delegado.Covariance permits a method to have return type that is more derived than that defined in the delegate. La contravarianza permite un método que tiene tipos de parámetro menos derivados que los del tipo de delegado.Contravariance permits a method that has parameter types that are less derived than those in the delegate type.

Ejemplo 1: CovarianzaExample 1: Covariance

DESCRIPCIÓNDescription

En este ejemplo se muestra cómo se pueden usar delegados con métodos que tienen tipos de valor devuelto derivados del tipo de valor devuelto en la firma del delegado.This example demonstrates how delegates can be used with methods that have return types that are derived from the return type in the delegate signature. El tipo de datos devuelto por DogsHandler es de tipo Dogs, que se deriva del tipo Mammals definido en el delegado.The data type returned by DogsHandler is of type Dogs, which derives from the Mammals type that is defined in the delegate.

CódigoCode

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

Ejemplo 2: ContravarianzaExample 2: Contravariance

DESCRIPCIÓNDescription

En este ejemplo se muestra cómo se pueden utilizar los delegados con métodos que tienen parámetros cuyos tipos son tipos base del tipo de parámetro de firma de delegado.This example demonstrates how delegates can be used with methods that have parameters whose types are base types of the delegate signature parameter type. Con la contravarianza, puede usar un controlador de eventos en lugar de controladores independientes.With contravariance, you can use one event handler instead of separate handlers. En el ejemplo siguiente se usa dos delegados:The following example makes use of two delegates:

En el ejemplo se define un controlador de EventArgs eventos con un parámetro y se usa para Button.KeyDown controlar Button.MouseClick los eventos y.The example defines an event handler with an EventArgs parameter and uses it to handle both the Button.KeyDown and Button.MouseClick events. Esto puede hacer esto porque EventArgs es un tipo base KeyEventArgs de y MouseEventArgs.It can do this because EventArgs is a base type of both KeyEventArgs and MouseEventArgs.

CódigoCode

' 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

Vea tambiénSee also