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ü, Dogs
temsilcide 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:
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, 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;
}