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 Sammlungen, die gemischte Typen enthalten, und deshalb hat jedes Objekt in C# Zugriff auf Methoden wie ToString() und GetType().
Aufgabe
EinfachErstellen wir ein Buchvergleichssystem, das zeigt, wie das Überschreiben von Methoden der Basisklasse object deinen benutzerdefinierten Typen ein sinnvolles Verhalten für die Zeichenfolgendarstellung und die Gleichheitsprüfung verleiht.
Du erstellst zwei Dateien, um deinen Code zu organisieren:
Book.cs: Definiere eineBook-Klasse imLibrary-Namespace. Dein Buch sollte die EigenschaftenTitle(string) undAuthor(string) sowie einen Konstruktor besitzen, der beide Werte festlegt. Überschreibe die drei wichtigen vonobjectgeerbten Methoden:ToString()sollte"{Title} by {Author}"zurückgebenEquals(object obj)solltetruezurückgeben, wenn das andere Objekt einBookmit demselbenTitleundAuthoristGetHashCode()sollte die Hashcodes beider Eigenschaften kombinieren
Program.cs: Erstelle in deiner Hauptdatei mithilfe von Eingabewerten zwei Bücher. Gib jedes Buch mitToString()aus, prüfe anschließend, ob sie gleich sind, und gib das Ergebnis aus. Zeige schließlich, dass du einBookin einerobject-Variablen speichern und beim Aufruf vonToString()weiterhin eine sinnvolle Ausgabe erhalten kannst.
Du erhältst vier Eingaben:
- Titel des ersten Buchs
- Autor des ersten Buchs
- Titel des zweiten Buchs
- Autor des zweiten Buchs
Gib 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 lauten, sollte die Ausgabe folgendermaßen 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 lauten, sollte die Ausgabe folgendermaßen 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 OrwellBeachte, wie deine überschriebenen Methoden Book-Objekten ein sinnvolles Verhalten verleihen – sie werden übersichtlich als Zeichenfolgen dargestellt und können anhand ihres Inhalts statt nur anhand ihrer Speicherreferenzen verglichen werden!
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. EigenschaftenKonstruktorenObjektinitialisiererWiederholung – Einfacher Taschenrechner4Vererbung
Grundlegende Vererbungs-(:)-SyntaxDas „base“-Schlüsselwort„virtual“- und „override“-SchlüsselwörterVersiegelte KlassenDie „object“-BasisklasseWiederholung – Mitarbeiterhierarchie7Erweiterte Funktionen
Überladen von OperatorenIndexer (this[])ToString()-ÜberschreibungErweiterungsmethodenRückblick – Benutzerdefinierte Liste10Entwurfsmuster Teil 1
Einführung in EntwurfsmusterThread-sicheres SingletonFactory-MusterObserver-Muster (Events)Strategy-Muster13Abschließende Herausforderungen
E-Learning-PlattformKomponente für SpielfigurenFahrzeugvermietungsdienst2Eigenschaften & statische Member
Automatisch implementierte EigenschaftenNur lesbare/schreibbare EigenschaftenStatische Felder & MethodenStatische KlassenMember mit Ausdruckskörpern5Polymorphie & Interfaces
Compile- vs. Laufzeit-PolymorphieInterface vs. abstrakte KlasseMehrere InterfacesExplizite InterfacesUpcasting & DowncastingWiederholung – Formenrechner3Klassenarchitektur
Instanz- vs. statische DatenSchlüsselwörter 'readonly' & 'const'Backing FieldsRückblick – Bankkontenverwaltung6Kapselung
ZugriffsmodifikatorenEigenschaften zur KapselungImplementierung der DatenkapselungMuster für UnveränderlichkeitRückblick – SchülerdatenÜbe selbstständig: Online-C#-Compiler