Menu
Coddy logo textTech

Generics (Klassen & Methoden)

Teil des Abschnitts Objektorientierte Programmierung der C#-Journey von Coddy. Lektion 42 von 70.

Generics ermöglichen es Ihnen, Klassen und Methoden zu schreiben, die mit jedem Datentyp arbeiten, während die Typsicherheit gewahrt bleibt. Anstatt separate Klassen für IntList, StringList und DoubleList zu schreiben, schreiben Sie eine generische Klasse, die sie alle verarbeitet.

Eine generische Klasse verwendet einen Typparameter, der normalerweise T benannt ist und in spitzen Klammern steht:

public class Box<T>
{
    private T content;
    
    public void Store(T item) => content = item;
    public T Retrieve() => content;
}

// Verwendung mit verschiedenen Typen
Box<int> intBox = new Box<int>();
intBox.Store(42);

Box<string> stringBox = new Box<string>();
stringBox.Store("Hello");

Wenn Sie Box<int> erstellen, ersetzt der Compiler jedes T durch int. Dies bietet eine Typprüfung zur Kompilierzeit – Sie können nicht versehentlich einen String in einer int-Box speichern.

Generische Methoden funktionieren ähnlich und ermöglichen es einer einzelnen Methode, mit verschiedenen Typen zu arbeiten:

public static void Swap<T>(ref T a, ref T b)
{
    T temp = a;
    a = b;
    b = temp;
}

int x = 1, y = 2;
Swap(ref x, ref y);  // x=2, y=1

Der Compiler leitet den Typ aus den Argumenten ab, sodass Sie Swap<int> nicht explizit schreiben müssen. Generika sind die Grundlage von Sammlungen wie List<T> und Dictionary<TKey, TValue>, was wiederverwendbaren, typsicheren Code ermöglicht.

challenge icon

Aufgabe

Einfach

Erstellen wir ein generisches Storage<T>-System, das Elemente beliebigen Typs speichern und verwalten kann. Du erstellst eine wiederverwendbare Containerklasse, die die Leistungsfähigkeit von Generics demonstriert – einmal schreiben, mit Ganzzahlen, Zeichenketten oder jedem anderen Typ verwenden!

Du organisierst deinen Code über zwei Dateien:

  • Storage.cs: Erstelle eine generische Storage<T>-Klasse im Namespace DataStorage. Dein Speichercontainer sollte:
    • Ein privates Array vom Typ T zum Speichern von Elementen und eine Count-Eigenschaft haben, die die Anzahl der gespeicherten Elemente verfolgt
    • In seinem Konstruktor eine Kapazität akzeptieren, um das interne Array zu initialisieren
    • Eine Add(T item)-Methode haben, die ein Element hinzufügt, wenn Platz vorhanden ist
    • Eine Get(int index)-Methode haben, die das Element am angegebenen Index zurückgibt
    • Eine GetAll()-Methode haben, die alle gespeicherten Elemente, verbunden durch ", ", zurückgibt
  • Program.cs: Demonstriere in deiner Hauptdatei, dass deine generische Klasse mit zwei verschiedenen Typen funktioniert. Erstelle ein Storage<int> und ein Storage<string>, füge jedem Elemente hinzu und zeige, dass dieselbe Klasse nahtlos mit beiden Typen funktioniert.

Du erhältst vier Eingaben:

  • Erste zu speichernde Ganzzahl
  • Zweite zu speichernde Ganzzahl
  • Erste zu speichernde Zeichenkette
  • Zweite zu speichernde Zeichenkette

Erstelle einen Integer-Speicher mit der Kapazität 5 und einen Zeichenketten-Speicher mit der Kapazität 5. Füge die beiden Ganzzahlen zum Integer-Speicher und die beiden Zeichenketten zum Zeichenketten-Speicher hinzu.

Gib die Ausgabe in diesem Format aus:

Int storage: {GetAll()}
Int count: {Count}
First int: {Get(0)}
String storage: {GetAll()}
String count: {Count}
First string: {Get(0)}

Wenn die Eingaben beispielsweise 42, 100, Hello und World lauten, sollte die Ausgabe wie folgt aussehen:

Int storage: 42, 100
Int count: 2
First int: 42
String storage: Hello, World
String count: 2
First string: Hello

Beachte, wie du die Klasse Storage<T> einmal schreibst, sie aber sowohl mit int als auch mit string perfekt funktioniert – das ist die Magie der Generics! Der Compiler stellt Typsicherheit sicher, sodass du nicht versehentlich eine Zeichenkette zu deinem Integer-Speicher hinzufügen kannst.

Probier es selbst

using System;
using DataStorage;

class Program
{
    public static void Main(string[] args)
    {
        // Eingaben lesen
        int num1 = Convert.ToInt32(Console.ReadLine());
        int num2 = Convert.ToInt32(Console.ReadLine());
        string str1 = Console.ReadLine();
        string str2 = Console.ReadLine();

        // TODO: Erstelle einen Storage<int> mit einer Kapazität von 5
        
        // TODO: Füge die beiden Ganzzahlen zum Ganzzahl-Speicher hinzu
        
        // TODO: Erstelle einen Storage<string> mit einer Kapazität von 5
        
        // TODO: Füge die beiden Zeichenfolgen zum Zeichenfolgen-Speicher hinzu
        
        // TODO: Gib die Ausgabe im erforderlichen Format aus
        // Int storage: {GetAll()}
        // Int count: {Count}
        // First int: {Get(0)}
        // String storage: {GetAll()}
        // String count: {Count}
        // First string: {Get(0)}
    }
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Online-C#-Compiler