NOEA/IT - FEN1 Typeparametisering/Genericity Generics i.NET 2 og C#
NOEA/IT - FEN2 ”Generisk” programmering i C# (som det har været indtil sommer 2005) Alle klasser nedstammer fra Object Så derfor kan vi anvende polymorfi F.eks. Object[ ] data –dette array kan indeholde alle mulige objekter fra alle mulige klasser Kendt fra ArrayList, HashMap osv. i.NET 1
NOEA/IT - FEN3 Fordele og ulemper Fordele –heterogene collections Ulemper –mange typecasts –ikke typesikkert typen checkes run-time i forbindelse med castet –hvad med int og de andre primitive datatyper? (boxing – giver overhead) Er det en fordel?
NOEA/IT - FEN4 Programmeringsfejl Programmet virker ikke korrekt, men det opdager vi ikke (uopdagede fejl) –så er det bedre, hvis: Programmet virker ikke korrekt, men vi får det at vide vha. f.eks. en exception (runtime fejl) –så er det bedre, hvis: Compileren accepterer ikke programmet (compile-time fejl)
NOEA/IT - FEN5 Strategien Placér så meget som muligt af fejl- kontrollen i compilerings-fasen Fordele: –Lettere at sikre korrekte programmer –Mere effektiv programeksekvering Ulemper –Mere restriktiv programmering (mindre fleksibilitet)
NOEA/IT - FEN6 Ideen: Typeparametrisering I version 1: using System.Collections; IList al = new ArrayList(); Kunde k= (Kunde) al.get(i); I version 2: using System.Collections.Generic; IList al = new List (); Kunde k= al.get(i); –Compileren ved nu, at der kun må placeres Kunde- objekter (og subtyper heraf) i al –Compileren ved nu, at det der hentes ud af al er Kunde-objekter (og subtyper heraf) –Statisk typecheck i stedet for dynamisk typecheck –Ingen dynamiske casts Typeparameter
NOEA/IT - FEN7 I C#: AnsatSeqProject Ansat a1 = new Ansat("Ib", "Programmør", 10000); Ansat a = new Ansat("Kurt", "Seniorprogrammør", 20000); Ansat b = new Ansat("Karl", "Programmør", 10000); Ansat c = new Ansat("Karen", "Systemprogrammør", 13000); Ansat d = new Ansat("Iben", "Programmør", 11000); Ansat e = new Ansat("Ib", "Systemkonsulent", 9000); string s = "Halløjsa!"; IList ansatte = new List (); ansatte.Add(a1); ansatte.Add(a); ansatte.Add(b); ansatte.Add(c); ansatte.Add(d); ansatte.Add(e); ansatte.Add(s);//COMPILERFEJL!!!! source
NOEA/IT - FEN8.NET 2 Generics ICollection IList LinkedList IDictionary List Dictionary SortedDictionary Indekserbare Array-baseret Balanceret søgetræ Hashtabel (key,value) -par
NOEA/IT - FEN9
NOEA/IT - FEN10
NOEA/IT - FEN11 Men det har en pris: –ingen heterogene collections hvilket vist ikke er et større savn... –typesystemet kompliceres –sprogets syntaks kompliceres –man får brug for en preprocessor så længere compileringstider og mere mystiske fejlmeddelelser
NOEA/IT - FEN12 Generiske typer vs. polymorfe typer Generiske typer: –alle elementer er af samme type –typen fastlægges statisk (compile-tid), statisk binding er mulig –F.eks vil en float i List l give en compile-fejl Polymorfe datastrukturer: –elementer kan være af forskellige typer, men alle elementer skal være specialiseringer af den type, der er defineret som element –statisk typekontrol er muligt, men dynamisk binding er nødvendig
NOEA/IT - FEN13 Forskelle på implementeringen C++ preprocessoren opfatter en template-definition som en slags makro dvs. vector kundeListe; og vector vareListe; får compileren til at generere kode til to forskellige vectors. –Effektivt, men objektkoden bliver stor Java bruger I princippet den gamle ArrayList, men indpakker castene for os. –Fylder ikke meget ekstra, men koster stadig tid til casts – check sker compiletid C# bruger C++ måden ved value-typer, men siges at være bedre til at undgå kodeduplikering, og bruger Java måden på referencetyper. Meta-data giver også information om typeparametre