Menu
Coddy logo textTech

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: Alice

Diese 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.

challenge icon

Aufgabe

Einfach

Lassen 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 Klasse Book im Namespace Library. Ihr Buch sollte die Eigenschaften Title (string) und Author (string) sowie einen Konstruktor haben, der beide Werte setzt. Überschreiben Sie die drei wichtigsten von object geerbten Methoden:
    • ToString() sollte "{Title} by {Author}" zurückgeben
    • Equals(object obj) sollte true zurückgeben, wenn das andere Objekt ein Book mit demselben Title und Author ist
    • GetHashCode() 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 mit ToString() an, prüfen Sie dann, ob sie gleich sind, und geben Sie das Ergebnis aus. Demonstrieren Sie schließlich, dass Sie ein Book in einer object-Variablen speichern können und beim Aufruf von ToString() 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 Orwell

Wenn 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 Orwell

Beachten 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: Alice

Diese 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}"
    }
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung