In het .NET Framework worden vaak kreten gebruikt waarbij een ontwikkelaar zich helemaal niets meer kan voorstellen. Twice docent Patrick Schmidt licht een aantal begrippen toe in een serie van vier artikelen.
Taalvernieuwingen in het .NET Framework 4.0. - deel I Covariantie
Deel 1 uit een serie artikelen van Patrick Schmidt, docent en consultant bij Twice IT Training
In het .NET Framework worden vaak kreten gebruikt waarbij een ontwikkelaar zich helemaal niets meer kan voorstellen. Covariantie is er daar één van. In dit eerste deel zal ik proberen dit begrip te verduidelijken.
Stel, je hebt de volgende hiërarchie:
interface IProduct
{
string Merk { get; }
}
class Melk : IProduct
{
public string Merk { get { return "Melk"; } }
}
Vervolgens definiëren we de methode:
void ToonProduct(IProduct product) {…}
Met de volgende aanroep zullen ontwikkelaars in het algemeen weinig moeite hebben:
Melk product = new Melk();
ToonProduct(product);
Ofschoon ToonProduct gedefinieerd is met een argument van type IProduct kunnen we hem aanroepen met een object van het type Melk. Dit komt doordat Melk de interface IProduct implementeert. “Vanzelfsprekend”, zullen een aantal mensen nu wel denken, maar bekijk nu de volgende methode en de aanroep:
void ToonProducts(IEnumerable <IProduct> product) {…}
IEnumerable <Melk> products = new List<Melk>();
ToonProducts(products);
Dit kan dus niet omdat IEnumerable<Melk> een ander type is dan IEnumerable <Product>. in oudere versies van het .NET Framework is IEnumerable <Product> invariant. Om dit probleem te verhelpen, is het begrip Covariantie ingevoerd. Dit gedrag wordt in de code aangegeven door het woordje “out” en kan alleen op generieke interfaces en delegates worden toegepast. Microsoft heeft in het .NET Framework 4.0 een aantal interfaces hierop aangepast. Eén daarvan is de interface IEnumerable<> die nu als volgt is gedefinieerd:
interface IEnumerable<out T> : IEnumerable
IEnumerable is nu variant geworden waardoor de eerdere aanroep wel is toegestaan. Deze vorm van variantie noemen we Covariant.
Terug naar het overzicht met alle artikelen over Taalvernieuwingen in het .NET Framework 4.0