Použití rozptylu v delegátech (C#)

Když přiřadíte metodu delegátovi, kovariance a kontravariance poskytují flexibilitu pro porovnávání typu delegáta s podpisem metody. Kovariance umožňuje, aby metoda měla návratový typ, který je odvozenější než ten definovaný v delegátu. Kontravariance umožňuje metodu, která má typy parametrů, které jsou méně odvozené než ty v typu delegáta.

Příklad 1: Kovariance

Popis

Tento příklad ukazuje, jak lze delegáty použít s metodami, které mají návratové typy odvozené od návratového typu v podpisu delegáta. Datový typ vrácený typem DogsHandler je typu Dogs, který je odvozen od Mammals typu, který je definován v delegátu.

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

Příklad 2: Kontravariance

Popis

Tento příklad ukazuje, jak lze delegáty použít s metodami, které mají parametry, jejichž typy jsou základní typy typu parametru podpisu delegáta. Při kontravarianci můžete místo samostatných obslužných rutin použít jednu obslužnou rutinu události. Následující příklad používá dva delegáty:

Příklad definuje obslužnou rutinu události s parametrem EventArgs a používá ji ke zpracování Button.KeyDown událostí i Button.MouseClick událostí. Může to udělat, protože EventArgs je základním typem obojího KeyEventArgs i MouseEventArgs.

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

Viz také