10. juli 2008 - 09:22Der er
4 kommentarer og 1 løsning
Hvordan undgår SortedList<> at implementere Add<T> i ICollection?
Jeg er ved at lave min egen liste (kaldet OrderetList) som skal fungere som SortedList<T, U> bortset fra at den tillader flere items med samme nøgle (hvor SortedList kun tillader een).
Altså kan min liste f.eks. bruges som en telefonbog hvor der er 1300 listet under navnet "Hansen". Hvis der allerede findes en implementation af denne funktionalitet, så vil jeg blive glad for at høre navnet på den.
Men mit spørgsmål er af lidt mere forståelsesmæssig karakter. Jeg kan se i dokumentationen af SortedList implementerer ICollection - og derfor bør den jo implementere Add(T). Men det gør den ikke (man kan i hvert tilfælde ikke kalde Add(T)).
Metoden Add(T, U) findes (som er en metode i IDictionary<T, U> som SortedList også implementerer.
Hvordan er det lykkes at skjule Add(T) ? Hvorfor skal den ikke implementeres? Kan nogen her kaste lys over det mysterie?
Så vidt jeg kan se, er Add(T) ikke en del af ICollection, men en del af ICollection<T>. SortedList<TK, TV> implementerer ICollection<KeyValuePair<TK, TV>> (altså T er KeyValuePair<TK, TV>), og derfor har den Add(TK, TV).
Den har en explicit interface implementation. Det vil sige at du skal caste en SortedList til ICollection foer du kan se metoden.
Fordelen ved dette er at man kan skjule metoder der typisk ikke bruges (Dictionary skjuler for exemple ogsaa Add fra ICollection). Derudover er det muligt at implementere to (eller flere) interfaces der har metoder eller properties med samme navn, men hvor man ikke oensker samme implementation.
Saa istedet for deklerationen: public void Add(T item)
er Add deklereret som: void ICollection.Add(T item)
Hvis du vil kalde Add metoden bruger du: ((ICollection)yourOrderedList).Add(whatever);
Så vidt jeg ved skal man stadig implementere alle metoder i en interface -også selvom de er eksplicitte. Ellers overholder man jo ikke den kontrakt som det var meningen interfaces skulle definere. Det var også derfor det forvirrede mig at SortedList ikke havde Add med kun een parameter.
Men kodehoved's svar giver god mening. Altså hvis det var et svar - for så ville det nemlig få points ;-)
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.