Variantie gebruiken in gemachtigden (C#)
Wanneer u een methode toewijst aan een gemachtigde, bieden covariantie en contravariantie flexibiliteit voor het koppelen van een gedelegeerdetype aan een methodehandtekening. Met covariantie kan een methode een retourtype hebben dat meer is afgeleid dan dat is gedefinieerd in de gemachtigde. Contravariantie staat een methode toe die parametertypen bevat die minder zijn afgeleid dan die in het type gemachtigde.
Voorbeeld 1: Covariantie
Beschrijving
In dit voorbeeld ziet u hoe gemachtigden kunnen worden gebruikt met methoden die retourtypen hebben die zijn afgeleid van het retourtype in de handtekening voor gemachtigden. Het gegevenstype dat wordt geretourneerd door DogsHandler
is van het type Dogs
, dat is afgeleid van het Mammals
type dat is gedefinieerd in de gemachtigde.
Code
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;
}
}
Voorbeeld 2: Contravariantie
Beschrijving
In dit voorbeeld ziet u hoe gemachtigden kunnen worden gebruikt met methoden met parameters waarvan de typen basistypen zijn van het parametertype voor de gedelegeerde handtekening. Met contravariantie kunt u één gebeurtenishandler gebruiken in plaats van afzonderlijke handlers. In het volgende voorbeeld worden twee gemachtigden gebruikt:
Een KeyEventHandler gemachtigde die de handtekening van de gebeurtenis Button.KeyDown definieert. De handtekening is:
public delegate void KeyEventHandler(object sender, KeyEventArgs e)
Een MouseEventHandler gemachtigde die de handtekening van de gebeurtenis Button.MouseClick definieert. De handtekening is:
public delegate void MouseEventHandler(object sender, MouseEventArgs e)
Het voorbeeld definieert een gebeurtenis-handler met een EventArgs parameter en gebruikt deze om zowel de als Button.MouseClick
de Button.KeyDown
gebeurtenissen te verwerken. Dit kan omdat EventArgs het een basistype is van zowel als KeyEventArgsMouseEventArgs.
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;
}