Använda varians i ombud (C#)
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 {}
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;
}
}
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:
Ett KeyEventHandler ombud som definierar signaturen för händelsen Button.KeyDown . Dess signatur är:
public delegate void KeyEventHandler(object sender, KeyEventArgs e)
Ett MouseEventHandler ombud som definierar signaturen för händelsen Button.MouseClick . Dess signatur är:
public delegate void MouseEventHandler(object sender, MouseEventArgs e)
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 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;
}