inspiro skrev:
Aha, ok tack, då förstår jag bättre! Några fler funderingar... eftersom IList är ett interface, måste man då inte implementera de metoder som ska finnas med i interfacet för att kunna använda IList? För om jag förstått det rätt så är ett interface en slags ram för vad som måste finnas med för att interfacet ska kunna användas?
Och varför skriver man så här:
IList<string> list = new List<string>(s);
...och inte så här:
IList<string> list = new IList<string>(s);
Vad är s?
Se Interface som ett kontrakt. IList är ett kontrakt som definierar vilka metoder som måste implementeras. IList innehåller ingen implementation utan bara metodsignaturerer etc. List är en klass som implementerar interface IList. Det vill säga, List innehåller implementationen av de metoder som defineras av interfacet IList.
inspiro skrev:
Aha, ok tack, då förstår jag bättre! Några fler funderingar... eftersom IList är ett interface, måste man då inte implementera de metoder som ska finnas med i interfacet för att kunna använda IList?
List är en implementation av IList som finns med i .NET-ramverket (System.Collections.Generic). Ibland kan man vilja ha en egen implementation av IList men List duger till det mesta.
inspiro skrev:
Och varför skriver man så här:
IList<string> list = new List<string>(s);
...och inte så här:
IList<string> list = new IList<string>(s);
Vad är s?
Du kan inte skriva "new IList()" eftersom IList är ett interface, dvs du kan inte skapa en instans av ett interface eftersom den inte innehåller någon implementation.
Båda dessa sätt fungerar däremot:
List<string> list = new List<string>(s);
IList<string> list = new List<string>(s);
Det är dock en viss skillnad mellan dessa två. Den första kan läsas som:
"Skapa ett nytt objekt av typen List"
medans den andra kan läsas som:
"Skapa ett nytt objekt av typen IList".
Skillnaden är den att om du skapar ett objekt av typen IList så kommer du bara åt de metoder som finns i interfacet IList. Säg att du gjort din egna klass som implementerat IList och även innehåller metoder som inte finns med i interface. Skriver du då såhär:
IList<string> list = new MyList<string>();
Så kommer du bara åt de metoder som finns i interfacet IList, detta fenomen brukar kallas "slicing", dvs allt som inte finns med i interfacet IList "klipps" bort. Gör du istället så här:
MyList<string> list = new MyList<string>();
Så kommer du åt allt som finns i din klass MyList. Är det möjligt så ska man dock försöka sträva efter att programmera mot ett interface.
inspiro skrev:
Vad är s?
s är din array som du postade i ditt första inlägg. Du behöver inte ha med det i konstruktorn. Det var bara ett exempel på hur du kan fylla din lista med värden vid initiering från en annan datastruktur som implementerar IEnumerabel.
/r Gladh var snabbare :)