Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
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;
}