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")