Kann jemand ein gutes Beispiel dafür geben, wofür generische Klassen verwendet werden sollen?

8

Wir haben kürzlich über generische Klassen in C # erfahren, aber unser Lehrer hat nicht erwähnt, wofür sie verwendet werden können. Ich kann wirklich keine guten Beispiele finden und wäre sehr glücklich, wenn mir jemand helfen würde:)

Haben Sie Ihre eigene generische Klasse erstellt und wofür haben Sie sie verwendet?

Einige Code-Beispiele würden mich und meine Klassenkameraden wirklich glücklich machen! Entschuldige das schlechte Englisch, ich komme aus Schweden:)

glückliche Programmierung!

Entschuldigung - ich denke, ich hätte die Frage etwas besser schreiben können. Ich bin mit generischen Sammlungen vertraut. Ich habe mich nur gefragt, wofür deine eigenen generischen Klassen verwendet werden können.

und danke für die MSDN-Links, ich habe sie gelesen, bevor ich die Frage gepostet habe, aber vielleicht habe ich etwas übersehen? Ich werde einen zweiten Blick haben!

    
Iris Classon 07.10.2011, 14:19
quelle

10 Antworten

3

Wenn man ein List-Objekt (nicht-generisch) hat, kann man alles darin speichern, was in Object umgewandelt werden kann, aber es gibt keine Möglichkeit, zur Kompilierungszeit zu wissen, welche Art von Dingen man daraus erhält. Im Gegensatz dazu, wenn man eine generische Liste & lt; Animal & gt; hat, sind die einzigen Dinge, die man darin speichern kann, Animal oder Derivate davon, und der Compiler kann wissen, dass die einzigen Dinge, die daraus gezogen werden, Animal sind. Der Compiler kann somit ermöglichen, dass Dinge aus der Liste herausgezogen und direkt in Felder vom Typ Animal gespeichert werden, ohne dass eine Laufzeittypprüfung erforderlich ist.

Wenn außerdem der generische Typparameter einer generischen Klasse ein Werttyp ist, kann die Verwendung von generischen Typen die Notwendigkeit für das Umwandeln in und aus Object eliminieren, einen Prozess namens "Boxen", der Entitäten vom Werttyp in einen Verweis konvertiert -Objekte; Boxen ist etwas langsam und kann manchmal die Semantik von Wert-Typ-Objekten ändern, und wird daher am besten vermieden, wenn möglich.

Beachten Sie, dass obwohl ein Objekt vom Typ SomeDerivedClass für TheBaseClass substituierbar ist, im Allgemeinen ein GenericSomething & lt; SomeDerivedClass & gt; ist nicht substituierbar für ein GenericSomething & lt; TheBaseClass & gt ;. Das Problem ist, dass wenn man z.B. eine Liste & lt; Giraffe & gt; für eine Liste & lt; Zebra & gt; könnte man eine Liste & lt; Zebra & gt; zu einer Routine, die eine List & lt; Giraffe & gt; und speichern Sie einen Elefanten darin. Es gibt jedoch einige Fälle, in denen die Ersetzbarkeit zulässig ist:

  1. Arrays eines abgeleiteten Typs können an Routinen übergeben werden, die Arrays vom Basistyp erwarten, vorausgesetzt, diese Routinen versuchen nicht, Elemente in diesen Arrays zu speichern, die nicht vom richtigen abgeleiteten Typ sind.
  2. Schnittstellen können so deklariert werden, dass sie "out" -Typ-Parameter haben, wenn das einzige, was diese Schnittstellen tun, Werte dieses Typs zurückgibt ("output"). Ein Giraffenlieferant kann einen Tierlieferanten ersetzen, weil es nur Giraffen liefern will, die wiederum für Tiere ersetzbar sind. Solche Schnittstellen sind in Bezug auf diese Parameter "kovariant".

Darüber hinaus ist es möglich, Interfaces zu deklarieren, um "in" -Typ-Parameter zu deklarieren, wenn die Interfaces nur die Parameter dieses Typs nach Wert akzeptieren. Ein Tierfresser kann einen Giraffenfresser ersetzen, denn - er ist in der Lage, alle Tiere zu essen und kann folglich alle Giraffen essen. Solche Schnittstellen sind in Bezug auf diese Parameter "kontravariant".

    
supercat 07.10.2011, 14:36
quelle
8

Generische Sammlungen

Generika für Sammlungen sind sehr nützlich, da sie die Art der Kompilierungszeit ermöglichen. Dies ist aus mehreren Gründen nützlich:

  • Beim Retraving von Werten ist kein Casting erforderlich. Dies ist nicht nur ein Leistungsvorteil, sondern eliminiert auch das Risiko, dass es zur Laufzeit eine Casting-Ausnahme gibt

  • Wenn Werttypen zu einer nicht generischen Liste hinzugefügt werden, z. B. einer ArrayList, müssen die Werte eingerahmt werden. Dies bedeutet, dass sie als Referenztypen gespeichert sind. Es bedeutet auch, dass nicht nur der Wert im Speicher gespeichert wird, sondern auch ein Verweis darauf, so dass mehr Speicher als nötig verwendet wird. Dieses Problem wird behoben, wenn generische Listen verwendet werden.

Generische Klassen

Generische Klassen können nützlich sein, um gemeinsamen Code für verschiedene Typen wiederzuverwenden. Nehmen Sie zum Beispiel eine einfache nicht generische Fabrikklasse:

%Vor%

Ich kann eine generische Klasse verwenden, um eine Factory für (fast) jeden Typ bereitzustellen:

%Vor%

In diesem Beispiel habe ich einen generischen Typ constraint von new () auf den Typparameter T gesetzt. Dies erfordert, dass der generische Typ einen parameterlosen Konstruktor enthält, der es mir ermöglicht, eine Instanz zu erstellen, ohne den Typ zu kennen.

    
Charlie 07.10.2011 14:22
quelle
6

Nur weil du gesagt hast, dass du Schwede bist, dachte ich, ich würde ein Beispiel geben, das IKEA-Möbel integriert. Ihre Kit Sofas sind ein Befall in Nordamerika, also dachte ich, ich würde etwas zurückgeben :) Stellen Sie sich eine Klasse vor, die ein bestimmtes Kit für den Bau von Stühlen und Tischen darstellt. Um authentisch zu bleiben, benutze ich sogar schwedische Nonsens-linguistische Homonyme:

%Vor%

Ok, jetzt haben wir alle Teile, die wir brauchen, um herauszufinden, wie man billige Möbel baut:

%Vor%

(Ja, der Mangel an Anweisungen und die drei Beine in der Stuhl-Kit ist absichtlich.)

Hoffe, das hilft auf eine frechen Art und Weise.

    
x0n 07.10.2011 14:56
quelle
2

Das gebräuchlichste Beispiel ist für Sammlungen wie List, Dictionary usw. Alle diese Standardklassen werden mit Generics implementiert.

Eine weitere Möglichkeit besteht darin, allgemeinere Dienstprogrammklassen oder -methoden für Operationen wie Sortieren und Vergleichen zu schreiben.

    
Agentlien 07.10.2011 14:27
quelle
1

Hier ist ein Microsoft-Artikel, der hilfreich sein kann: Ссылка

Der größte Vorteil, den ich gesehen habe, ist die Compile-Time-Sicherheit von Generika, wie @ Charlie erwähnt. Ich habe auch eine generische Klasse verwendet, um einen DataReader für Masseneinfügungen in eine Datenbank zu implementieren.

    
DJ Quimby 07.10.2011 14:24
quelle
1

Beispiel aus der realen Welt für Generika.

Denk daran, dass du einen Käfig hast, in dem viele verschiedene Vögel (Papagei, Vogel, Spatz, Krähe, Ente) drin sind (nicht generisch).

Sie erhalten nun eine Arbeit, um den Vogel in separate Käfige (speziell für einen einzelnen Vogel gebaut) aus dem oben angegebenen Käfig zu bringen.

(Problem mit der nicht generischen Liste) Es ist eine langwierige Aufgabe, den bestimmten Vogel aus dem alten Käfig zu fangen und in den dafür vorgesehenen Käfig zu bringen (Welcher Vogel in welchen Käfig - Typ casting in c #)

allgemeine Liste

Nun denken Sie, Sie haben einen separaten Käfig für separate Vögel und Sie möchten in andere Käfige umziehen, die dafür gemacht wurden. Dies wird eine leichte Aufgabe sein und es wird nicht dauern, bis du es tust (kein Typcasting erforderlich - ich meine die Vögel mit Käfigen zu kartieren).

    
rajiv 20.03.2013 08:56
quelle
0

Sehen Sie sich diesen Artikel von Microsoft an. Sie haben eine schöne und klare Erklärung, wofür Sie sie verwenden sollen und wann Sie sie verwenden sollen. Ссылка

    
Husein Roncevic 07.10.2011 14:24
quelle
0

Die verschiedenen generischen Sammlungen sind das beste Beispiel für die Verwendung von Generika, aber wenn Sie ein Beispiel möchten, das Sie vielleicht selbst generieren, können Sie sich meine Antwort auf diese alte Frage ansehen:

Verwendung von Delegaten in c oder anderen Sprachen

Ich bin mir nicht sicher, ob es ein besonders gutes Beispiel für die Verwendung von Generika ist, aber es ist etwas, das ich gelegentlich mache.

    
Russell Troywest 07.10.2011 14:30
quelle
0

Nun, Sie haben eine Menge Proben im Rahmen. Stellen Sie sich vor, dass Sie eine Liste von Intergern implementieren müssen, und später eine Liste von Strings ... und später eine Liste Ihrer Kundenklasse ... usw. Es wäre sehr schmerzhaft.

Wenn Sie jedoch eine generische Liste implementieren, wird das Problem in kürzerer Zeit und in weniger Code gelöst, und Sie müssen nur eine Klasse testen.

Vielleicht müssen Sie eines Tages eine eigene Warteschlange mit Regeln für die Priorität jedes Elements implementieren. Dann wäre es eine gute Idee, diese Warteschlange generisch zu machen, wenn es möglich ist.

Dies ist ein sehr einfaches Beispiel, aber wenn Sie Ihre Programmierkenntnisse verbessern, werden Sie sehen, wie nützlich es sein kann, ein (zum Beispiel) generisches Repository zu haben (Es ist ein Design-Muster).

Nicht jeden Tag Programmierer machen generische Klassen, aber vertrauen Sie mir, Sie werden gerne mit einem solchen Tool zählen, wenn Sie es brauchen.

    
Jonathan 07.10.2011 14:23
quelle
0

Sprechen Sie über eine Basisklasse (oder vielleicht eine abstrakte Klasse)? Als eine Klasse, von der Sie andere Klassen (Subklassen) erstellen würden?

Wenn dies der Fall ist, würden Sie eine Basisklasse erstellen, um Methoden und Eigenschaften einzubeziehen, die den Klassen gemeinsam sind, die sie erben. Eine Auto-Klasse würde beispielsweise Räder, Motoren, Türen usw. enthalten. Dann könnten Sie vielleicht eine Unterklasse sportsCar erstellen, die die Fahrzeugklasse erbt und Eigenschaften wie Spoiler, TurboCharger usw. hinzufügt.

Ссылка ) Linkbeschreibung hier eingeben

Es ist schwer zu verstehen, was Sie mit "generischer Klasse" ohne Kontext meinen.

    
Yatrix 18.10.2011 16:07
quelle

Tags und Links