Generic
Eintrag zuletzt aktualisiert am: 11.10.2011
Generische Klassen (Generics) - verfügbar ab C# 8.0 bzw.
Visual Basic 8.0 - erlauben es, einen oder mehrere Typen, die die Klasse intern verarbeitet, variabel zu halten (Typparameter). Ein typischer Einsatzfall sind generische
Objektmengen. Generische Objekt-mengen ermöglichen es, dass der Entwickler einen allgemeinen Mengentyp so prägt, dass die Menge nur Mitglieder einer bestimmten Klasse akzeptiert und dafür eine Typprüfung bereits zur Entwicklungszeit stattfindet.
Beispiel: List<Person> bedeutet, dass diese
Liste Personen-instanzen verwalten soll. SortedDictionary<int, Person> bedeutet, dass diese Instanz der SortedDictionary-Klasse Personen speichern soll und dabei Zahlen als Schlüsselwerte verwendet. Dabei sind "int" und "Person" sogenannt Typparameter.
Auch generische
Methoden sind möglich. Dabei erhält die
Methode beim Aufruf Typparameter.
Eigene Generische Klassen
Neben den in der
FCL implementierten generischen
Objektmengen kann man in VB und C# auch selbst generische Klassen erzeugen. In diesem Kapitel wird die Definition und Verwendung eigener generischer Klassen besprochen.
Die Definition einer generischen Klasse für ein Tennis-Doppel zeigt Listing 1. Die Klasse Doppel erwartet, dass die Datentypen für die Mitglieder Partner1 und Partner2 bei der Instanziierung der Klasse vorgegeben werden. Eine gültige Instanziierung für ein gemischtes Doppel wäre z.B. Doppel<Mann,Frau> d1 = new Doppel<Mann,Frau>(m,f); während die Angabe von zwei Mann-Objekten in diesem Konstruktor zum Fehler führen würde. Den durch die Typparameter <Mann, Frau> näher spezifizierten Datentyp nennt man einen
Constructed Type.
Ein wichtiges Ansatzgebiet für Generics sind typisierte
Objektmengen. Während die
.NET-Klassenbibliothek bisher nur untypisierte
Objektmengen definiert hat, ermöglichen in
.NET 2.0 die in dem neuen Namensraum
System.Collections.Generic hinterlegten Klassen die einfache Definition von typisierten
Objektmengen. Generics können auch auf andere
.NET-Typen wie Strukturen, Schnittstellen und
Delegaten sowie auf
Methoden angewendet werden.
Namespace de.Tennis
{
public class Doppel<PartnerTyp1, PartnerTyp2>
{
public PartnerTyp1 Partner1;
public PartnerTyp2 Partner2;
public Doppel(PartnerTyp1 Partner1,PartnerTyp2 Partner2 )
{
if ((Partner1.GetType().ToString() != Partner2.GetType().ToString()))
{ Console.WriteLine("Gemischtes Doppelt!"); }
else { Console.WriteLine("Gleichgeschlechtliches Doppel!");
}
}
}
}
Listing 1: Definition einer generischen Klassen
Andere Sprachen
Generics sind auch verfügbar in Ada, C++ (
Templates) und
Java (ab Version 1.5 "
Tiger")