Covariante e controvariante nei delegati (Guida per programmatori C#)
Aggiornamento: novembre 2007
La covariante e la controvariante forniscono un ampio grado di flessibilità quando si ricerca una corrispondenza tra le firme dei metodi e i tipi delegati. Attraverso la covariante un metodo può avere un tipo restituito più derivato rispetto a quanto è definito nel delegato. La controvariante consente un metodo con tipi di parametri meno derivati rispetto a quelli del tipo delegato.
Esempio 1 (covariante)
Descrizione
Nell'esempio seguente viene illustrato come utilizzare i delegati con metodi che hanno tipi restituiti derivati dal tipo restituito nella firma del delegato. Il tipo di dati restituito da SecondHandler è di tipo Dogs, che deriva dal tipo Mammals definito nel delegato.
Code
class Mammals
{
}
class Dogs : Mammals
{
}
class Program
{
// Define the delegate.
public delegate Mammals HandlerMethod();
public static Mammals FirstHandler()
{
return null;
}
public static Dogs SecondHandler()
{
return null;
}
static void Main()
{
HandlerMethod handler1 = FirstHandler;
// Covariance allows this delegate.
HandlerMethod handler2 = SecondHandler;
}
}
Esempio 2 (controvariante)
Descrizione
Nell'esempio seguente viene illustrato come utilizzare i delegati con metodi che hanno parametri di un tipo che è tipo base del tipo di parametro della firma del delegato. Con la controvariante è ora possibile utilizzare un gestore eventi nei punti in cui, in precedenza, era necessario utilizzare gestori separati. È ora ad esempio possibile creare un gestore eventi che accetta un parametro di input EventArgs e utilizzarlo con l'evento Button.MouseClick che invia un tipo MouseEventArgs come parametro e con l'evento TextBox.KeyDown che invia un parametro KeyEventArgs.
Code
System.DateTime lastActivity;
public Form1()
{
InitializeComponent();
lastActivity = new System.DateTime();
this.textBox1.KeyDown += this.MultiHandler; //works with KeyEventArgs
this.button1.MouseClick += this.MultiHandler; //works with MouseEventArgs
}
// Event hander for any event with an EventArgs or
// derived class in the second parameter
private void MultiHandler(object sender, System.EventArgs e)
{
lastActivity = System.DateTime.Now;
}
Vedere anche
Concetti
Riferimenti
Eventi (Guida per programmatori C#)