Lädt...

Überladung

Lege in einer Klasse zwei Methoden an, die beide den Namen paint nutzen. Ein Header ist static void paint(string word). Der andere ist static void paint(int n). Die Rümpfe sind kurz: der erste schreibt word, der zweite schreibt n. Aus Main rufe paint("ok"); und dann paint(3); auf. Der Bildschirm sollte zwei Zeilen zeigen: ok in der ersten und 3 in der zweiten. C# behandelt das zweite paint nicht als Konflikt. Es behandelt die beiden Header als unterschiedliche Methoden, weil die Parameterlisten sich unterscheiden. Dieser gemeinsame Name mit unterschiedlichen Listen ist das, was diese Seite lehrt. Behalte den öffentlichen Klassennamen Pine.

Gleicher Name, unterschiedliche Listen

Bis jetzt nutzte jede neue Idee einen frischen Methodennamen: ring, greet, twice. Hier bleibt der Name absichtlich paint. Was sich ändert, steht zwischen den Klammern. Eine Liste hält ein string. Eine andere hält ein int. Der Compiler behält beide, weil diese Listen nicht gleich sind.
Öffne die Pine-Datei. Der Klassenname bleibt Pine. Diese Seite benennt den Typ nicht um. Lösche jede twice-Demo, die n * 2 zurückgibt, falls das noch alles ist, was du in Main hast. Lösche jedes übrig gebliebene greet. Lösche jede ReadLine-Zeile. Die Datei, die du behältst, wartet nicht auf Tippen.
Außerhalb von Main, noch in den geschweiften Klammern der Klasse, schreibe beide paint-Header. Behalte auf dieser Seite void: jeder Rumpf schreibt, und nichts muss über return zu Main zurückkommen. Der erste Rumpf nutzt Console.WriteLine(word);. Der zweite nutzt Console.WriteLine(n);. Speichere die Datei vor dem Start. Das vollständige erste Programm steht im nächsten Kasten.

Die Datei, die du behältst

Das ist die Version, die du zuerst startest. Main hält zwei Aufrufe. Die Klasse hält zwei paint-Methoden, die einen Namen teilen.

paint string and paint int

csharp
using System;

public class Pine
{
    public static void Main()
    {
        paint("ok");
        paint(3);
    }

    static void paint(string word)
    {
        Console.WriteLine(word);
    }

    static void paint(int n)
    {
        Console.WriteLine(n);
    }
}

Lies es von oben. using System; bereitet kurze Namen vor. public class Pine benennt den Typ. public static void Main() ist, wo die Laufzeit startet. Der erste Aufruf ist paint("ok"). Das Argument ist ein string, also führt C# den Rumpf aus, der string word nimmt, und schreibt ok. Der zweite Aufruf ist paint(3). Das Argument ist ein int, also führt C# den Rumpf aus, der int n nimmt, und schreibt 3. Der Name paint ist beide Male gleich. Die Liste in den Klammern wählt den Rumpf. Zwei Zeilen auf dem Bildschirm: ok, dann 3.

Starte es mit dotnet run. Das Programm schreibt zwei Zeilen und stoppt. Es wartet nicht darauf, dass du tippst. Wenn dotnet run wartet, steckt ReadLine noch in der Datei. Lösche diese Zeile und behalte die beiden paint-Aufrufe plus die beiden paint-Methoden darüber. Der Bildschirm zeigt ok, dann 3. Wenn beide Zeilen ok zeigen, hast du vielleicht nur die string-Methode gelassen und für jeden Aufruf ein festes Wort geschrieben. Wenn beide Zeilen 3 zeigen, hast du vielleicht nur die int-Methode gelassen. Behalte beide Header. Wenn der Build meldet, dass paint schon definiert ist, prüfe, ob beide Header dieselbe Liste haben — zum Beispiel zwei Kopien von paint(string word). Überladung braucht einen echten Unterschied in der Liste, nicht eine zweite Kopie desselben Headers nur mit anderem Parameternamen. Du installierst das .NET SDK nicht neu für einen Bildschirm mit falschen Zeilen.

Eine zweite Liste mit zwei Wörtern

Auch die Parameteranzahl kann sich unterscheiden. Füge eine dritte Überladung hinzu, die zwei string-Werte nimmt und sie in einer Zeile mit Leerzeichen schreibt. Lass die ersten beiden paint-Methoden stehen, wenn du alle drei zusammen übst. Für eine fokussierte Demo nur dieser Form kannst du eine Datei nutzen, die nur diese Liste hält.

paint two strings

csharp
using System;

public class Pine
{
    public static void Main()
    {
        paint("hi", "sam");
    }

    static void paint(string a, string b)
    {
        Console.WriteLine(a + " " + b);
    }
}

Das ist die zweite Datei. Sie lehrt Anzahl als Listenunterschied. Starte dotnet run. Der Bildschirm sollte eine Zeile zeigen: hi sam. Der Aufruf hat zwei Argumente. Die Methode hat zwei Parameter. Diese Übereinstimmung reicht, damit C# diesen Rumpf wählt. Wenn du noch die früheren paint(string word) und paint(int n) in derselben Klasse hast, kannst du sie behalten. Ein Aufruf mit zwei string-Werten wählt nicht die Ein-Argument-string-Methode, weil die Anzahlen sich unterscheiden.
Wenn du alle drei Überladungen in einer Datei zum Üben legst, kann Main jede Form in der eigenen Zeile aufrufen. Ein Aufruf mit einem string geht weiterhin zu paint(string word). Ein Aufruf mit einem int geht weiterhin zu paint(int n). Ein Aufruf mit zwei string-Werten geht zu paint(string a, string b). Der gemeinsame Name löscht diese Unterschiede nicht. Nachdem du hi sam gesehen hast, lege die behaltene Zwei-Aufruf-Datei zurück, wenn das die Form ist, die du speichern willst: paint("ok"); dann paint(3);.

Leere Liste neben einer string-Liste

Eine Methode mit leeren Klammern ist auch eine andere Liste. Du kannst paint() ohne Parameter neben paint(string word) behalten. Der leere Aufruf paint(); führt den Rumpf der leeren Liste aus. Der Aufruf paint("go"); führt den string-Rumpf aus.

paint empty and paint string

csharp
using System;

public class Pine
{
    public static void Main()
    {
        paint();
        paint("go");
    }

    static void paint()
    {
        Console.WriteLine("ready");
    }

    static void paint(string word)
    {
        Console.WriteLine(word);
    }
}

Das ist die dritte Datei. Starte dotnet run. Der Bildschirm sollte ready in der ersten Zeile und go in der zweiten zeigen. Der erste Aufruf hat nichts zwischen den Klammern, also passt er zu paint(). Der zweite Aufruf sendet ein string, also passt er zu paint(string word). Eine Methode in paintReady umzubenennen würde auch bauen, aber das ist eine andere Fertigkeit. Diese Seite behält den Namen paint und lässt die Listen den Unterschied tragen.

Welcher Aufruf führt welchen Header aus

Lies die Aufrufe neben den Headern. Die Argumentliste im Aufruf muss zur Parameterliste im Header passen. Typ und Anzahl zählen beide bei dieser Anfängerform.

📊 call beside matching paint

Call in Main Header that runs Screen line
paint("ok"); paint(string word) ok
paint(3); paint(int n) 3
paint("hi", "sam"); paint(string a, string b) hi sam
paint(); paint() ready

Ein häufiger Mix-up ist, zwei Methoden zu schreiben, die beide paint(string word) sagen, und zu erwarten, dass die zweite als Überladung zählt. Nur den Parameternamen zu paint(string label) zu ändern erzeugt für den Compiler keine neue Liste. Typ und Anzahl sind hier entscheidend. Ein anderer Mix-up ist, paint(true) aufzurufen, ohne je eine bool-Parameterliste geschrieben zu haben. Dann findet der Build kein passendes paint. Füge einen Header hinzu, der den gewünschten Typ nimmt, oder ändere den Aufruf zu einem Typ, den du schon unterstützt.
Console.WriteLine("paint"); in Main schreibt das Wort paint. Es ruft keine Methode auf. Behalte paint("ok");, wenn du die Überladung willst, die ein string nimmt. Eine übrig gebliebene twice-Methode in derselben Datei kann den Bildschirm verwirren, wenn Main noch twice(7) schreibt. Räume Main auf die paint-Aufrufe, die du testest, und behalte nur die paint-Überladungen, die du für diesen Lauf brauchst.
Verschachtele keine paint-Methode in den Klammern von Main. Methoden sitzen in der Klasse, neben Main. Zwei Überladungen sind zwei Geschwistermethoden in demselben Klassenrumpf.

Du kannst einen Methodennamen und mehrere Parameterlisten in derselben Klasse behalten. C# wählt den Rumpf aus der Argumentliste des Aufrufs. Der Bildschirm zeigt die Zeile des passenden Rumpfs. Zwei Header mit derselben Liste sind keine Überladungen. Die nächste Seite ist scope, wo du siehst, welche Namen innerhalb einer Methode sichtbar sind und welche draußen bleiben.

Der Bildschirm hält den passenden Rumpf

Die Datei, die du behältst, schreibt ok, dann 3, wenn Main paint("ok"); und paint(3); aufruft. Der gemeinsame Name paint steht in jedem Aufruf, und die Buchstaben paint sind nicht als gedrucktes Label auf dem Bildschirm, es sei denn, du hast sie in Anführungszeichen gesetzt. Eine paint-Methode in Main zu verschachteln ist nicht die Form, die diese Lektion baut.

🧠 Testen Sie Ihr Wissen

Bereit zum Start

Testen Sie Ihr Wissen

Fordern Sie sich mit diesem interaktiven Quiz heraus und sehen Sie, wie gut Sie das Thema verstehen

❓
5
Fragen
🎯
70%
Zum Bestehen
♾️
∞
Zeit
🔄
∞
Versuche

📝 Anweisungen

  • Lesen Sie jede Frage sorgfältig
  • Wählen Sie die beste Antwort für jede Frage
  • Sie können das Quiz so oft wiederholen, wie Sie möchten
  • Ihr Fortschritt wird oben angezeigt