Aracılığıyla paylaş


Temsilcilerde Varyans Kullanımı (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 metodun temsilcide tanımlanandan daha fazla türetilmiş dönüş türüne sahip olmasına olanak tanır. 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 belirtilen dönüş türlerinden türetilen dönüş türlerine sahip yöntemlerle nasıl kullanılabileceğini gösterir. DogsHandler tarafından döndürülen veri türü, temsilcide tanımlanan Dogs türünden 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: Kontravaryans

Açıklama

Bu örnek, temsilcilerin, parametre türleri temsilci imzasındaki parametre türünün temel türleri 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:

  • KeyEventHandler Button.KeyDown olayının imzasını tanımlayan bir temsilci. İmzası:

    public delegate void KeyEventHandler(object sender, KeyEventArgs e)
    
  • MouseEventHandler Button.MouseClick olayının imzasını tanımlayan bir temsilci. İmzası:

    public delegate void MouseEventHandler(object sender, MouseEventArgs e)
    

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

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 bakınız