Compartilhar via


Usando variação em delegações (C#)

Quando você atribui um método a um delegado, a covariância e a contravariância fornecem flexibilidade para a correspondência de um tipo delegado com uma assinatura de método. A covariância permite que um método tenha um tipo de retorno mais derivado do que o definido no delegado. A contravariância permite um método que tem tipos de parâmetro que são menos derivados do que aqueles no tipo delegado.

Exemplo 1: Covariância

Descrição

Este exemplo demonstra como os delegados podem ser usados com métodos que têm tipos de retorno derivados do tipo de retorno na assinatura do delegado. O tipo de dados retornado por DogsHandler é do tipo Dogs, que deriva do Mammals tipo definido no delegado.

Código

class Mammals {}  
class Dogs : Mammals {}  
  
class Program  
{  
    // Define the delegate.  
    public delegate Mammals HandlerMethod();  
  
    public static Mammals MammalsHandler()  
    {  
        return null;  
    }  
  
    public static Dogs DogsHandler()  
    {  
        return null;  
    }  
  
    static void Test()  
    {  
        HandlerMethod handlerMammals = MammalsHandler;  
  
        // Covariance enables this assignment.  
        HandlerMethod handlerDogs = DogsHandler;  
    }  
}  

Exemplo 2: contravariância

Descrição

Este exemplo demonstra como os delegados podem ser usados com métodos que têm parâmetros cujos tipos são tipos base do tipo de parâmetro de assinatura delegado. Com o conceito de contravariância, você pode utilizar um único manipulador de eventos em vez de handlers separados. O exemplo a seguir usa dois delegados:

  • Um representante KeyEventHandler que define a assinatura do evento Button.KeyDown. Sua assinatura é:

    public delegate void KeyEventHandler(object sender, KeyEventArgs e)
    
  • Um representante MouseEventHandler que define a assinatura do evento Button.MouseClick. Sua assinatura é:

    public delegate void MouseEventHandler(object sender, MouseEventArgs e)
    

O exemplo define um manipulador de eventos com um parâmetro EventArgs e o usa para manipular tanto os eventos Button.KeyDown quanto os eventos Button.MouseClick. Ele pode fazer isso porque EventArgs é um tipo base de ambos KeyEventArgs e MouseEventArgs.

Código

// Event handler that accepts a parameter of the EventArgs type.  
private void MultiHandler(object sender, System.EventArgs e)  
{  
    label1.Text = System.DateTime.Now.ToString();  
}  
  
public Form1()  
{  
    InitializeComponent();  
  
    // You can use a method that has an EventArgs parameter,  
    // although the event expects the KeyEventArgs parameter.  
    this.button1.KeyDown += this.MultiHandler;  
  
    // You can use the same method
    // for an event that expects the MouseEventArgs parameter.  
    this.button1.MouseClick += this.MultiHandler;  
  
}  

Consulte também