Die 'object'-Basisklasse
Teil des Abschnitts Objektorientierte Programmierung der C#-Journey von Coddy — Lektion 23 von 70.
In C# erbt jede Klasse, die Sie erstellen, automatisch von einer speziellen Klasse namens object. Selbst wenn Sie nicht explizit eine Basisklasse angeben, hat Ihre Klasse dennoch object als ihren obersten Vorfahren. Das bedeutet, dass jeder Typ in C# über einen gemeinsamen Satz von Methoden verfügt.
Die object-Klasse stellt mehrere virtuelle Methoden bereit, die Sie in Ihren eigenen Klassen überschreiben können:
public class Person
{
public string Name { get; set; }
// Überschreibung von object
public override string ToString()
{
return $"Person: {Name}";
}
public override bool Equals(object obj)
{
if (obj is Person other)
return Name == other.Name;
return false;
}
public override int GetHashCode()
{
return Name?.GetHashCode() ?? 0;
}
}Die drei am häufigsten überschriebenen Methoden sind ToString() für die String-Repräsentation, Equals() zum Vergleichen von Objekten und GetHashCode() für Hash-basierte Sammlungen. Standardmäßig gibt ToString() den Typnamen zurück, und Equals() prüft auf Referenzgleichheit.
Da alles von object erbt, können Sie jeden Typ in einer object-Variablen speichern:
object item1 = new Person { Name = "Alice" };
object item2 = 42;
object item3 = "Hello";
Console.WriteLine(item1.ToString()); // Person: AliceDiese universelle Basisklasse ermöglicht Funktionen wie Collections, die gemischte Typen enthalten, und sie ist der Grund, warum jedes Objekt in C# Zugriff auf Methoden wie ToString() und GetType() hat.
Aufgabe
EinfachLassen Sie uns ein Buchvergleichssystem erstellen, das zeigt, wie das Überschreiben von Methoden der Basisklasse object Ihren benutzerdefinierten Typen ein aussagekräftiges Verhalten für die String-Darstellung und die Gleichheitsprüfung verleiht.
Sie werden zwei Dateien erstellen, um Ihren Code zu organisieren:
Book.cs: Definieren Sie eine KlasseBookim NamespaceLibrary. Ihr Buch sollte die EigenschaftenTitle(string) undAuthor(string) sowie einen Konstruktor haben, der beide Werte setzt. Überschreiben Sie die drei wichtigsten vonobjectgeerbten Methoden:ToString()sollte"{Title} by {Author}"zurückgebenEquals(object obj)solltetruezurückgeben, wenn das andere Objekt einBookmit demselbenTitleundAuthoristGetHashCode()sollte die Hash-Codes beider Eigenschaften kombinieren
Program.cs: Erstellen Sie in Ihrer Hauptdatei zwei Bücher unter Verwendung von Eingabewerten. Zeigen Sie jedes Buch mitToString()an, prüfen Sie dann, ob sie gleich sind, und geben Sie das Ergebnis aus. Demonstrieren Sie schließlich, dass Sie einBookin einerobject-Variablen speichern können und beim Aufruf vonToString()immer noch eine aussagekräftige Ausgabe erhalten.
Sie erhalten vier Eingaben:
- Titel des ersten Buches
- Autor des ersten Buches
- Titel des zweiten Buches
- Autor des zweiten Buches
Geben Sie die Ausgabe in diesem Format aus:
Book 1: {ToString result}
Book 2: {ToString result}
Are they equal? {True/False}
Stored as object: {ToString result of first book stored in object variable}Wenn die Eingaben beispielsweise 1984, George Orwell, 1984 und George Orwell sind, sollte die Ausgabe wie folgt aussehen:
Book 1: 1984 by George Orwell
Book 2: 1984 by George Orwell
Are they equal? True
Stored as object: 1984 by George OrwellWenn die Eingaben 1984, George Orwell, Brave New World und Aldous Huxley sind, sollte die Ausgabe wie folgt aussehen:
Book 1: 1984 by George Orwell
Book 2: Brave New World by Aldous Huxley
Are they equal? False
Stored as object: 1984 by George OrwellBeachten Sie, wie Ihre überschriebenen Methoden den Book-Objekten ein aussagekräftiges Verhalten verleihen – sie werden ansprechend als Strings angezeigt und können anhand ihres Inhalts verglichen werden, anstatt nur anhand ihrer Speicherreferenzen!
Spickzettel
In C# erbt jede Klasse automatisch von der Klasse object, die mehrere virtuelle Methoden bereitstellt, die überschrieben werden können:
Häufig zu überschreibende Object-Methoden
ToString()- Gibt eine String-Repräsentation des Objekts zurück (standardmäßig wird der Typname zurückgegeben)Equals(object obj)- Vergleicht Objekte auf Gleichheit (standardmäßig wird die Referenzgleichheit geprüft)GetHashCode()- Gibt einen Hash-Code für die Verwendung in Hash-basierten Sammlungen zurück
Überschreiben von Object-Methoden
public class Person
{
public string Name { get; set; }
// Überschreibe ToString für eine benutzerdefinierte String-Repräsentation
public override string ToString()
{
return $"Person: {Name}";
}
// Überschreibe Equals für inhaltsbasierten Vergleich
public override bool Equals(object obj)
{
if (obj is Person other)
return Name == other.Name;
return false;
}
// Überschreibe GetHashCode für Hash-basierte Sammlungen
public override int GetHashCode()
{
return Name?.GetHashCode() ?? 0;
}
}Universelle Basisklasse
Jeder Typ kann in einer object-Variablen gespeichert werden:
object item1 = new Person { Name = "Alice" };
object item2 = 42;
object item3 = "Hello";
Console.WriteLine(item1.ToString()); // Person: AliceDiese universelle Vererbung ermöglicht Sammlungen, die gemischte Typen enthalten, und stellt sicher, dass jedes Objekt Zugriff auf Methoden wie ToString() und GetType() hat.
Probier es selbst
using System;
using Library;
class Program
{
public static void Main(string[] args)
{
// Eingabe für zwei Bücher lesen
string title1 = Console.ReadLine();
string author1 = Console.ReadLine();
string title2 = Console.ReadLine();
string author2 = Console.ReadLine();
// TODO: Zwei Book-Objekte unter Verwendung der Eingabewerte erstellen
// TODO: Book 1 mittels ToString() ausgeben
// Format: "Book 1: {ToString result}"
// TODO: Book 2 mittels ToString() ausgeben
// Format: "Book 2: {ToString result}"
// TODO: Prüfen, ob die Bücher gleich sind, und das Ergebnis ausgeben
// Format: "Are they equal? {True/False}"
// TODO: Das erste Buch in einer object-Variable speichern und ausgeben
// Format: "Stored as object: {ToString result}"
}
}
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