ToString() überschreiben
Teil des Abschnitts Objektorientierte Programmierung der C#-Journey von Coddy — Lektion 38 von 70.
Jede Klasse in C# erbt von object, welche eine ToString()-Methode bereitstellt. Standardmäßig gibt sie den vollqualifizierten Typnamen zurück – nicht besonders nützlich, wenn man die tatsächlichen Daten eines Objekts sehen möchte.
Sie können ToString() überschreiben, um eine aussagekräftige String-Repräsentation Ihres Objekts zurückzugeben:
public class Person
{
public string Name { get; }
public int Age { get; }
public Person(string name, int age)
{
Name = name;
Age = age;
}
public override string ToString()
{
return $"{Name} ({Age} years old)";
}
}Wenn Sie nun ein Person-Objekt ausgeben oder verketten, erhalten Sie eine lesbare Ausgabe:
Person p = new Person("Alice", 30);
Console.WriteLine(p); // Alice (30 Jahre alt)Ohne das Überschreiben würde dies etwas wie MyNamespace.Person ausgeben. Das Schlüsselwort override ist erforderlich, da Sie die geerbte Methode von object ersetzen. Dies ist besonders wertvoll für das Debugging und Logging, wenn Sie einen schnellen Einblick in den Zustand eines Objekts benötigen.
Aufgabe
EinfachLassen Sie uns eine Book-Klasse erstellen, die beim Drucken aussagekräftige String-Repräsentationen liefert, was das Debugging und die Anzeige von Buchinformationen wesentlich intuitiver macht.
Sie werden Ihren Code auf zwei Dateien verteilen:
Book.cs: Erstellen Sie eineBook-Klasse im NamespaceLibrary, die ein Buch mit seinen wesentlichen Details darstellt. Ihr Buch sollte Folgendes haben:- Drei schreibgeschützte Eigenschaften:
Title(string),Author(string) undYear(int) - Einen Konstruktor, der Titel, Autor und Jahr in dieser Reihenfolge akzeptiert
- Eine überschriebene
ToString()-Methode, die einen formatierten String zurückgibt:"{Title}" by {Author} ({Year})
- Drei schreibgeschützte Eigenschaften:
Program.cs: Erstellen Sie in Ihrer Hauptdatei einBook-Objekt unter Verwendung von Eingabewerten und geben Sie es direkt aus. Dank IhrerToString()-Überschreibung wird die Übergabe des Buchobjekts anConsole.WriteLine()automatisch die formatierten Informationen anstelle des Typnamens anzeigen.
Sie erhalten drei Eingaben:
- Buchtitel (string)
- Name des Autors (string)
- Erscheinungsjahr (integer)
Geben Sie das Buchobjekt direkt mit Console.WriteLine() aus.
Wenn die Eingaben beispielsweise The Great Gatsby, F. Scott Fitzgerald und 1925 sind, sollte die Ausgabe wie folgt aussehen:
"The Great Gatsby" by F. Scott Fitzgerald (1925)Der Clou dabei ist, dass Sie ToString() nicht explizit aufrufen – wenn Sie ein Objekt an Console.WriteLine() übergeben, wird automatisch die ToString()-Methode des Objekts aufgerufen. Ihre Überschreibung macht diese Ausgabe nützlich, anstatt nur Library.Book anzuzeigen!
Spickzettel
Jede Klasse in C# erbt von object, welches eine ToString()-Methode bereitstellt. Standardmäßig gibt diese den vollqualifizierten Typnamen zurück.
Überschreiben Sie ToString(), um eine aussagekräftige String-Repräsentation zurückzugeben:
public class Person
{
public string Name { get; }
public int Age { get; }
public Person(string name, int age)
{
Name = name;
Age = age;
}
public override string ToString()
{
return $"{Name} ({Age} years old)";
}
}Wenn Sie ein Objekt ausgeben, wird ToString() automatisch aufgerufen:
Person p = new Person("Alice", 30);
Console.WriteLine(p); // Alice (30 years old)Das Schlüsselwort override ist erforderlich, wenn eine geerbte Methode von object ersetzt wird.
Probier es selbst
using System;
using Library;
class Program
{
public static void Main(string[] args)
{
// Eingabe lesen
string title = Console.ReadLine();
string author = Console.ReadLine();
int year = Convert.ToInt32(Console.ReadLine());
// TODO: Erstelle ein Book-Objekt unter Verwendung der Eingabewerte
// TODO: Gib das Book-Objekt direkt mit Console.WriteLine() aus
}
}
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 – Studierendendaten