Temsilcilerde Varyansı Kullanma (C#)

Bir temsilciye bir yöntem atadığınızda, kovaryans ve ters değişken, bir temsilci türünü yöntem imzası ile eşleştirme esnekliği sağlar. Kovaryans, bir yöntemin temsilcide tanımlanandan daha fazla türetilmiş dönüş türüne sahip olmasına izin verir. Contravariance, temsilci türündekilerden daha az türetilmiş parametre türlerine sahip bir yönteme izin verir.

Örnek 1: Kovaryans

Açıklama

Bu örnek, temsilcilerin temsilci imzasında dönüş türünden türetilen dönüş türlerine sahip yöntemlerle nasıl kullanılabileceğini gösterir. tarafından DogsHandler döndürülen veri türü, Dogstemsilcide tanımlanan türden türetilen Mammals türündedir.

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

Örnek 2: Contravariance

Açıklama

Bu örnek, temsilcilerin, türleri temsilci imzası parametre türünün temel türleri olan parametreleri olan yöntemlerle nasıl kullanılabileceğini gösterir. Contravariance ile ayrı işleyiciler yerine tek bir olay işleyicisi kullanabilirsiniz. Aşağıdaki örnekte iki temsilci kullanılır:

Örnek, parametresi olan bir EventArgs olay işleyicisi tanımlar ve hem hem Button.MouseClick de olaylarını Button.KeyDown işlemek için bunu kullanır. Bunu yapabilir çünkü EventArgs hem hem MouseEventArgsde KeyEventArgs taban türündedir.

Kod

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

Ayrıca bkz.