Megosztás a következőn keresztül:


Variancia használata a meghatalmazottakban (C#)

Amikor metódust rendel egy delegálthoz, a kovariancia és a kontravariancia rugalmasságot biztosít a meghatalmazott típusának metódusa aláírással való egyeztetéséhez. A kovariancia lehetővé teszi, hogy egy metódus olyan visszatérési típussal rendelkezzen, amely származtatottabb, mint a delegáltban definiált. A contravariance olyan metódust engedélyez, amely a delegált típushoz képest kevésbé származtatott paramétertípusokkal rendelkezik.

1. példa: Kovariancia

Leírás

Ez a példa bemutatja, hogyan használhatók a delegáltak olyan metódusokkal, amelyek a delegált aláírás visszatérési típusából származtatott visszatérési típussal rendelkeznek. A visszaadott DogsHandler adattípus típusa a Dogsdelegáltban definiált típusból Mammals származik.

Kód

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;  
    }  
}  

2. példa: Contravariance

Leírás

Ez a példa bemutatja, hogyan használhatók a delegáltak olyan metódusokkal, amelyek olyan paraméterekkel rendelkeznek, amelyek típusa a delegált aláírás paramétertípus alaptípusa. A contravariance használatával külön kezelők helyett egy eseménykezelőt használhat. Az alábbi példa két meghatalmazottat használ:

A példa egy paraméterrel rendelkező EventArgs eseménykezelőt határoz meg, és azt használja az események és Button.MouseClick az Button.KeyDown események kezelésére is. Ez azért lehetséges, mert EventArgs mindkettő és KeyEventArgsMouseEventArgsa .

Kód

// 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;  
  
}  

Kapcsolódó információk