Generiska konstruktioner Kursbokens kapitel 13 1
Vad är en generisk konstruktion? Generisk står för; allmän eller generell En generisk konstruktion kan användas för olika typer av data Med hjälp av templates så kan man beskriva en mall för en sådan konstruktion I C# så går det att definiera templates som beskriver hela klasser och templates som beskriver enstaka metoder 2
Generiska metoder En generisk metod kan deklareras på följande sätt [åtkomst] T MetodNamn<T>(T a, T b) [restriktioner] //Ett antal satser [åtkomst] returtyp MetodNamn<T>(T a, T b) [restriktioner] //Ett antal satser [åtkomst] returtyp MetodNamn<T1, T2, T3, >(T1 a, T2 b, T3 c, ) [restriktioner] //Ett antal satser T kallas för en typparameter T fungerar som en platshållare för den riktiga typen T kommer att automatiskt att bytas ut mot den typ som passar för de aktuella parametrar som sänds med vid ett anrop av metoden. Det möjligt att ange flera typparameter 3
Generisk klass Om man deklarerar en klass som generisk så behöver man inte deklarera de metoder som använder klassens typparametrar som generiska metoder [åtkomst] class KlassensNamn <T1, T2> [restriktioner] [åtkomst] T1 variabelnamn; [åtkomst] T2 MetodNamn(T1 namna, T2 namnb) //Satser se exempel GeneriskKlass 4
Ett exempel på en metod En metod som jämför två tecken using System; public class Verktyg public bool ÄrMindreÄn(char värdea, char värdeb) if (värdea < värdeb) return true; return false; Motsvarande generiska metod using System; public class Verktyg public bool ÄrMindreÄn<Typ>(Typ värdea, Typ värdeb) where <Typ> : IComparable<Typ> if (värdea.compareto(värdeb) < 0) return true; return false; Varför använder den generiska metoden CompareTo och inte < operatorn? Eftersom värdea och värdeb är av en okänd typ så är det inte säkert att < operatorn fungerar för den okända typen. Därför måste man i stället använda sig av metoden CompareTo. Metoden CompareTo är deklarerad i gränssnittet IComparable interface IComparableint CompareTo<T>(T a, T b); //Finns färdig i.net-biblioteket Om en klass implementerar IComparable så betyder det att klassen garanterar att det finns en metod CompareTo i klassen where : IComparable <T> begränsar de typer som metoden kan använda till de typer som har implementerat IComparable 5
En klass vars objekt går att jämföra public class Person : IComparable<Person> private string namn; private int ålder; // I och med klassen implementerar gränssnittet IComparable måste den metod som // är deklarerad i gränssnittet definieras här i klassen public int CompareTo(Person enperson) if (enperson == null) throw new Exception("En null-referens!"); if (Åldern < enperson.ålder) return -1; if (Åldern == enperson.ålder) return 0; return 1; 6
En ny version metod ÄrMindreÄn En ny version enbart för personer using System; public class Verktyg public bool ÄrMindreÄn(Person värdea, Person värdeb) if (värdea.compareto(värdeb) < 0) return true; return false; Men den generiska metod består! using System; public class Verktyg public bool ÄrMindreÄn<Typ>(Typ värdea, Typ värdeb) where <Typ> : IComparable<Typ> if (värdea.compareto(värdeb) < 0) return true; return false; Varför använda den generiska metoder? Om vi väljer att använda templates, det vill säga deklarera att metoden MindreÄn ska använda typparametern Typ så kommer den metoden att fungera för både objekt av klassen Person och objekt av alla andra klasser som implementerar gränssnittet IComparable. Dessutom kommer den generiska versionen av metoden att fungera för alla värden av enkla datatyper på grund av att, för de enkla datatyperna är redan gränssnitten IComparable implementerad. Se, Exempel01 och Exempel02 7
Nu ska du kunna Förklara vad generiska klasser och metoder är Använda generiska metoder och klasser Förklara vad de interfaces som förekommer i programkoden är Förstå vad som det innebär att implementera de metoder som är deklarerade i ett interface 8