Laden...

[beantwortet] eigene Collection statt IList<T>?

Erstellt von Froggie vor 13 Jahren Letzter Beitrag vor 13 Jahren 2.910 Views
F
Froggie Themenstarter:in
323 Beiträge seit 2007
vor 13 Jahren
[beantwortet] eigene Collection statt IList<T>?

Über die Suche habe ich nichts passendes gefunden.

Ich habe mehrere Methoden, welche alle eine IList<MeineKlasse> zurückgeben oder als Parameter empfangen.
Nun möchte ich gerne eine eigene Collection dafür nutzen.

Ist es legitim solch eine Klasse zu erstellen? Also so ganz ohne Inhalt.
Man kann zwar von collectionBase erben, aber was spricht gegen das Erben von List<T>?

Gibt es dafür eine Best Practice?

meine Collection


internal class MeineKlasseCollection : List<MeineKlasse>
    {
    }

Vielen Dank im Voraus!

Z
403 Beiträge seit 2007
vor 13 Jahren

Hallo Froggie,

in einigen Fällen mache ich es genauso.
Aber manchmal benutze ich einfache Komposition in meinem Objekt.
(z.B. wenn ich an der Liste nichts mehr erweitern möchte)

André

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo Froggie,

sicher könnte man eine eigene Listenklasse "from scratch" schreiben. Sinnvoll ist das aber normalerweise nicht. Gegen das Erben von List<T> spricht, dass die meisten Methoden nicht virtuell sind und daher die nötigen Anpassungen normalerweise nicht möglich sind. Erbe von Collection<T>, die ist extra dafür gemacht.

herbivore

5.742 Beiträge seit 2007
vor 13 Jahren

Ist es legitim solch eine Klasse zu erstellen? Also so ganz ohne Inhalt.

Naja - die Frage ist doch: Welchen Vorteil hat's?
In den meisten Fällen vermutlich keinen - außer, dass man sich ein paar Zeichen Tipparbeit bei der Erstellung spart - und das ist IMHO verkraftbar.

Ansonsten spricht eigentlich nichts dagegen.

185 Beiträge seit 2005
vor 13 Jahren

hallo,

wenn es eine Klasse ist, die von anderen wiederverwendet wird, würde ich das nicht machen (eigentlich auch nicht, wenn nur ich sie verwende) - wenn dir Intellisense als Rückgabeparameter List<T> anzeigt, ist jedem Programmierer klar, was das ist - wenn er hingegen als Rückgabeparameter "MeineKlasseCollection" sieht imho. nicht so. Außerdem würde ich als Rückgabeparameter - wenn möglich IEnumerable<T> verwenden.

Is aber persönliche Meinung.

fg
hannes

F
Froggie Themenstarter:in
323 Beiträge seit 2007
vor 13 Jahren

Ich habe jetzt von Collection<T> geerbt und die Sort-Methode zur Verfügung gestellt.

@hannesb
Du solltest mal "Code Complete 2" lesen. Habe ich gerade 3/4 durch.
Dort wird explizit empfohlen eine eigene Collection bereitzustellen. Macht in meinen Augen Sinn. Im Framework wird das auch so gehandhabt.

Meine Collection


internal class MeineKlasseCollection : Collection<MeineKlasse>
    {
        //Voraussetzung ist, dass MeineKlasse das Intreface IComparable<T> implementiert
        public void Sort()
       {
           this.Sort();
       }
    }

5.941 Beiträge seit 2005
vor 13 Jahren

Hallo zusammen

Wie herbivore schon geschrieben hat, wurde Collection<T> für die Erweiterung entwickelt. Hat also virtuelle Methoden. Auch dafür gibts Interfaces, bspw. ICollection<T>.

List<T> sollte nicht veröffentlicht werden, sondern ein Interna einer Klasse bleiben. Das rührt daher, das diese Klasse auf Performance ausgerichtet, geschrieben wurde und keine Erweiterungspunkte enthält.

Vor einiger Zeit habe ich das Thema, was und wieso man etwas als Rückgabewert oder Parameterwert nutzen soll, durchgenommen. Entstanden ist dabei ein Artikel:

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo Froggie,

warum willst du eine eigene Sort-Methode anbieten bzw. was ist an der anders als anders Sort-Methode von List<T>?

Hallo HannesB,

dass Froggie den eigenen Collection-Typ nicht direkt verwenden will, sondern stattdessen den Typ IList<T> hat er von Anfang an geschrieben. Stattdessen IEnummerable<T> zu verwenden, wäre für den Aufrufer der Methode eine unnötige Einschränkung und daher nicht so sinnvoll.

Hallo zusammen,

das Thema mit der Wahl des passensten Collection-(Interface-)Typs als Parameter oder Rückgabetyp wurde auch in IList<T> oder List<T> als Parameter- bzw. Rückgabetyp? besprochen.

herbivore