woensdag 7 april 2010

Covariance en Contravariance - Part 1

Covariance en Contravariance zijn nieuwe begrippen van .net 4.0 die wellicht vaag overkomen, maar we gebruiken het eigenlijk altijd al in object orientatie; genaamd polymorphisme.

Voorbeeld:
class Person {
string Name {get;set;}
}
class Employee : Person {
string EmployeeNr {get;set;}
}

class F
{
public void Foo(Person p)
{
Console.WriteLine(p.Name);
}
public void Foo (Person[] p)
{
foreach (Person item in p){
....
}
}

}

//implementatie
new F().Foo(new Employee());


Wat je definieert is een methode wat een baseclass als parameter ontvangt en in je implementatie geef je een derived class door.
Dit heet Contravariance

Dit werkt ook gewoon voor de array implementatie, maar tot en met versie 3.5 was dit niet mogelijk voor Generics.

De volgende method compileerde niet als je daar een lijst met Employees aan doorgeeft
public void Foo (IEnumerable<Person> p)
{
foreach (var item in p){
....
}
}

Het voorbeeld met de method Foo wordt aangeduid als Contravariance.
Contravariance werkt met inkomende inheritance van de generic types, dit wordt nog duidelijker als je met delegates gaat werken.

Indien je een delegate wilt definieren welke het polymorphisme ondersteund dan schrijf je het volgende:

public void SetNameDelegate<in T, in T2>(T person, T2 name);
Je kunt deze nu aanroepen door:
SetNameDelegate setName = (p,n) => { p.Name = n; };
SetNameDelegate setNameEmp = setName;
Door het gebruik van hetkeyword IN geef je de compiler aan dat deze er vanuit kan gaan dat het juiste type wordt doorgegeven om mee te werken.

Ik hoop dat het zo een stukje duidelijker is geworden voor eenieder.
Eerdaag zal ik een stukje schrijven over Covariance

Geen opmerkingen:

Een reactie posten