Covariance (Kovaryans) ve contravariance (kontravaryans), sınıf hiyerarşisi ile uğraşırken esnek olmamızı sağlayan bir yapıdır.
Covariance (Kovaryans) ve contravariance (kontravaryansı) öğrenmeden önce aşağıdaki sınıf hiyerarşisini bir inceleyelim.
public class Small
{
}
public class Big: Small
{
}
public class Bigger : Big
{
}
Yukarıdaki örnek sınıflara göre, Small Big için bir base sınıftır ve Big ise Bigger için bir base sınıftır. Burada hatırlanması gereken nokta, türetilmiş bir sınıfın her zaman bir base sınıftan daha fazlasına sahip olacağıdır. Bu nedenle base sınıf, türetilmiş sınıftan nispeten daha küçüktür.
Şimdi, aşağıdaki başlatmayı göz önünde bulundurun:
Yukarıda görebileceğiniz gibi, bir base sınıf, türetilmiş bir sınıfı tutabilir, ancak türetilmiş bir sınıf, bir base sınıfı tutamaz.
Şimdi covariance (Kovaryans) ve contravariance (kontravaryans) öğrenelim.
C# Covariance (Kovaryans) Nedir?
Covariance (Kovaryans), bir base türün beklendiği yerde türetilmiş bir türü geçirmenizi sağlar. Co-variance )Eş varyans), aynı türden varyans gibidir. Base sınıf ve diğer türetilmiş sınıflar, base tipe ekstra işlevler ekleyen aynı tip sınıf olarak kabul edilir. Dolayısıyla Covariance (kovaryans), bir base sınıfın beklendiği yerde türetilmiş bir sınıf kullanmanıza izin verir (kural: küçük bekleniyorsa büyük kabul edebilir).
Kovaryans, delegate, generic, array, interface vb. yapılar üzerinde uygulanabilir.
.NET, covariant (kovaryant) olan birçok yerleşik generic interface sahiptir; örneğin, IEnumerable<T> interface’i:
IEnumerable<T> bir covariance (kovaryans) olduğundan, Aşağıdaki örnekte ki gibi Employee (türetilmiş sınıf) nesneleri listesini Person (base sınıf) nesneleri listesine atayabilirsiniz:
internal class Program
{
public static void Display(IEnumerable<Person> people)
{
foreach (var person in people)
{
Console.WriteLine(person.Name);
}
}
private static void Main(string[] args)
{
List<Employee> Emplist = new List<Employee>()
{
new Employee("Fatih Alkan", "C# Developer"),
new Employee("Beyazıt Alkan", "UI/UX Designer")
};
Display(Emplist);
}
}
public class Person
{
public string Name { get; set; }
public Person(string name)
{
Name = name;
}
}
public class Employee : Person
{
public string JobTitle { get; set; }
public Employee(string name, string jobTitle) : base(name)
{
JobTitle = jobTitle;
}
}
Covariance (Kovaryans) Delegate Kullanımı
Delegatelerde ki covariance (kovaryans), delegate metotlarının dönüş tipinde esneklik sağlar.
public delegate Small covarDel(Big mc);
public class Program
{
public static Big Method1(Big bg)
{
Console.WriteLine("Method1");
return new Big();
}
public static Small Method2(Big bg)
{
Console.WriteLine("Method2");
return new Small();
}
public static void Main(string[] args)
{
covarDel del = Method1;
Small sm1 = del(new Big());
del= Method2;
Small sm2 = del(new Big());
}
}
Sonuç:
Method1
Method2
Yukarıdaki örnekte görebileceğiniz gibi, delegate Small (base sınıf) bir dönüş tipi bekler, ancak yine de Big (türetilmiş sınıf) döndüren Method1’i ve ayrıca delegate’in beklediğiyle aynı imzaya sahip Method2’yi atayabiliriz.
Böylece, kovaryans, delegate’e daha az türetilmiş dönüş tipine sahip bir metot atamanıza izin verir.
C# Contravariance (Kontvaryans) Nedir?
Contravariance parametrelere uygulanır. Contravariance, bir base sınıfın parametresine sahip bir metodun, türetilmiş bir sınıfın parametresini bekleyen bir delegate atanmasına izin verir.
Yukarıdaki örnekle devam ederek, temsilciden farklı bir parametre türüne sahip Method3’ü ekleyin:
delegate Small covarDel(Big mc);
class Program
{
static Big Method1(Big bg)
{
Console.WriteLine("Method1");
return new Big();
}
static Small Method2(Big bg)
{
Console.WriteLine("Method2");
return new Small();
}
static Small Method3(Small sml)
{
Console.WriteLine("Method3");
return new Small();
}
static void Main(string[] args)
{
covarDel del = Method1;
del += Method2;
del += Method3;
Small sm = del(new Big());
}
Sonuç:
Method1
Method2
Method3
Gördüğünüz gibi, Method3, Small sınıfının bir parametresine sahipken, delegate, Big sınıfının bir parametresini bekler. Yine de, Method3’ü delegate ile kullanabilirsiniz.
Covariance (Kovaryans) ve contravariance (kontravaryans) aşağıda gösterilen yöntemle aynı şekilde de kullanabilirsiniz.
delegate Small covarDel(Big mc);
class Program
{
static Big Method4(Small sml)
{
Console.WriteLine("Method3");
return new Big();
}
static void Main(string[] args)
{
covarDel del = Method4;
Small sm = del(new Big());
}
}
Sonuç: Method4
One comment
Comments are closed.