Methodenüberladung
Teil des Abschnitts Objektorientierte Programmierung der C#-Journey von Coddy — Lektion 50 von 70.
Methodenüberladung ermöglicht es Ihnen, mehrere Methoden mit demselben Namen, aber unterschiedlichen Parameterlisten zu definieren. Der Compiler bestimmt basierend auf den von Ihnen bereitgestellten Argumenten, welche Version aufgerufen werden soll.
Jede überladene Methode muss eine eindeutige Signatur haben – entweder eine unterschiedliche Anzahl von Parametern oder unterschiedliche Parametertypen:
public static void Print(string message)
{
Console.WriteLine(message);
}
public static void Print(string message, int times)
{
for (int i = 0; i < times; i++)
Console.WriteLine(message);
}
public static void Print(int number)
{
Console.WriteLine(number);
}// Der Compiler wählt die richtige Version
Print("Hello"); // Ruft Print(string) auf
Print("Hi", 3); // Ruft Print(string, int) auf
Print(42); // Ruft Print(int) aufÜberladung unterscheidet sich in einem wichtigen Punkt von optionalen Parametern. Bei optionalen Parametern haben Sie eine Methode, die mehrere Szenarien verarbeitet. Bei der Überladung haben Sie separate Methoden, die für jeden Fall eine völlig unterschiedliche Logik enthalten können.
Beachten Sie, dass der Rückgabetyp allein Methoden nicht eindeutig macht – Sie können nicht zwei Methoden haben, die sich nur durch das unterscheiden, was sie zurückgeben. Die Parameterliste muss unterschiedlich sein. Methodenüberladung ist eine Form des Polymorphismus zur Kompilierzeit, bei der die Entscheidung darüber, welche Methode aufgerufen werden soll, beim Kompilieren des Codes getroffen wird und nicht während der Laufzeit.
Aufgabe
EinfachLassen Sie uns eine vielseitige Taschenrechner-Klasse erstellen, die die Leistungsfähigkeit der Methodenüberladung demonstriert. Sie werden mehrere Versionen von Berechnungsmethoden erstellen, die verschiedene Szenarien abdecken – von einfachen Operationen mit zwei Zahlen bis hin zu komplexeren Berechnungen – und dabei alle dieselben intuitiven Methodennamen verwenden.
Sie werden Ihren Code auf zwei Dateien verteilen:
Calculator.cs: Erstellen Sie eineCalculator-Klasse im NamespaceMathToolsmit überladenen Methoden, die denselben Namen tragen, aber unterschiedliche Parameter akzeptieren:Multiply- Erstellen Sie drei überladene Versionen:- Eine, die zwei
int-Parameter entgegennimmt und deren Produkt alsintzurückgibt - Eine, die drei
int-Parameter entgegennimmt und deren Produkt alsintzurückgibt - Eine, die zwei
double-Parameter entgegennimmt und deren Produkt alsdoublezurückgibt
- Eine, die zwei
Describe- Erstellen Sie zwei überladene Versionen:- Eine, die ein
intentgegennimmt und"Integer: {value}"zurückgibt - Eine, die ein
doubleentgegennimmt und"Double: {value}"zurückgibt
- Eine, die ein
Program.cs: Erstellen Sie in Ihrer Hauptdatei eineCalculator-Instanz und demonstrieren Sie, wie der Compiler automatisch die korrekte überladene Methode basierend auf den von Ihnen bereitgestellten Argumenten auswählt.
Sie erhalten vier Eingaben:
- Erste Ganzzahl (z. B.
5) - Zweite Ganzzahl (z. B.
4) - Dritte Ganzzahl (z. B.
3) - Eine Dezimalzahl (z. B.
2.5)
Führen Sie mit Ihrem Taschenrechner diese Operationen aus und geben Sie jedes Ergebnis in einer eigenen Zeile aus:
- Multiplizieren Sie die ersten beiden Ganzzahlen (verwendet die Version mit zwei Integern)
- Multiplizieren Sie alle drei Ganzzahlen (verwendet die Version mit drei Integern)
- Multiplizieren Sie die erste Ganzzahl und die Dezimalzahl (verwendet die Version mit zwei Doubles)
- Beschreiben Sie die erste Ganzzahl (verwendet die int-Version)
- Beschreiben Sie die Dezimalzahl (verwendet die double-Version)
Wenn die Eingaben beispielsweise 5, 4, 3 und 2.5 sind, sollte die Ausgabe wie folgt aussehen:
20
60
12.5
Integer: 5
Double: 2.5Beachten Sie, wie Sie Multiply und Describe mit unterschiedlichen Argumenttypen und -anzahlen aufrufen, der Compiler jedoch jedes Mal genau weiß, welche Version er verwenden muss. Dies ist Polymorphie zur Kompilierzeit in Aktion – die Entscheidung fällt beim Kompilieren Ihres Codes, nicht während der Laufzeit!
Probier es selbst
using System;
using MathTools;
class Program
{
public static void Main(string[] args)
{
// Eingaben lesen
int firstInt = Convert.ToInt32(Console.ReadLine());
int secondInt = Convert.ToInt32(Console.ReadLine());
int thirdInt = Convert.ToInt32(Console.ReadLine());
double decimalNum = Convert.ToDouble(Console.ReadLine());
// TODO: Eine Calculator-Instanz erstellen
// TODO: Multiply mit zwei Ganzzahlen aufrufen und das Ergebnis ausgeben
// TODO: Multiply mit drei Ganzzahlen aufrufen und das Ergebnis ausgeben
// TODO: Multiply mit der ersten Ganzzahl und der Dezimalzahl aufrufen, das Ergebnis ausgeben
// TODO: Describe mit der ersten Ganzzahl aufrufen und das Ergebnis ausgeben
// TODO: Describe mit der Dezimalzahl aufrufen und das Ergebnis ausgeben
}
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP
Externe DateienNamespaces & DirektivenEinführung in Klassen & ObjekteDas 'this'-SchlüsselwortMethoden und ParameterFelder vs. EigenschaftenKonstruktorenObjekt-InitialisiererZusammenfassung - Einfacher Taschenrechner4Vererbung
Grundlagen der Vererbung (:) SyntaxDas 'base'-SchlüsselwortVirtual & Override SchlüsselwörterVersiegelte KlassenDie 'object'-BasisklasseZusammenfassung – Mitarbeiter-Hierarchie7Fortgeschrittene Funktionen
OperatorüberladungIndexer (this[])ToString() überschreibenErweiterungsmethodenZusammenfassung - Benutzerdefinierte Liste2Eigenschaften & Statische Member
Automatisch implementierte EigenschaftenRead-Only- & Write-Only-EigenschaftenStatische Felder & MethodenStatische KlassenExpression-Bodied Member5Polymorphismus & Interfaces
Compile- vs. Runtime-PolymorphismusInterface vs. abstrakte KlasseMehrfache InterfacesExplizite InterfacesUpcasting & DowncastingRecap – Shape Calculator3Klassenarchitektur
Instanz- vs. statische Daten'readonly' & 'const' SchlüsselwörterBacking FieldsZusammenfassung - Bankkonto-Manager6Kapselung
ZugriffsmodifikatorenProperties zur KapselungImplementierung von Data HidingImmutability-MusterRückblick – Studierendendaten9Variable Argumente
Das 'params'-SchlüsselwortOptionale ParameterBenannte ArgumenteMethodenüberladung