Menu
Coddy logo textTech

Bazowa klasa 'object'

Część sekcji Programowanie obiektowe ścieżki C# w Coddy. Lekcja 23 z 70.

W języku C# każda tworzona przez Ciebie klasa automatycznie dziedziczy po specjalnej klasie o nazwie object. Nawet jeśli nie określisz jawnie klasy bazowej, Twoja klasa i tak ma object jako swojego ostatecznego przodka. Oznacza to, że wszystkie typy w języku C# mają wspólny zestaw metod.

Klasa object udostępnia kilka metod wirtualnych, które możesz przesłonić we własnych klasach:

public class Person
{
    public string Name { get; set; }
    
    // Przesłonięcie metody z klasy 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;
    }
}

Trzy najczęściej przeciążane metody to ToString(), służąca do uzyskiwania tekstowej reprezentacji, Equals(), służąca do porównywania obiektów, oraz GetHashCode(), używana w kolekcjach opartych na haszach. Domyślnie ToString() zwraca nazwę typu, a Equals() sprawdza równość referencji.

Ponieważ wszystko dziedziczy po object, możesz przechowywać dowolny typ w zmiennej object:

object item1 = new Person { Name = "Alice" };
object item2 = 42;
object item3 = "Hello";

Console.WriteLine(item1.ToString());  // Person: Alice

Ta uniwersalna klasa bazowa umożliwia tworzenie takich elementów jak kolekcje przechowujące różne typy. Dzięki niej każdy obiekt w C# ma dostęp do metod takich jak ToString() i GetType().

challenge icon

Wyzwanie

Łatwy

Zbudujmy system porównywania książek, który pokazuje, jak nadpisywanie metod z klasy bazowej object nadaje Twoim własnym typom sensowne zachowanie podczas reprezentacji tekstowej i sprawdzania równości.

Utworzysz dwa pliki, aby uporządkować swój kod:

  • Book.cs: Zdefiniuj klasę Book w przestrzeni nazw Library. Twoja książka powinna mieć właściwości Title (string) i Author (string), a także konstruktor, który ustawia obie wartości. Nadpisz trzy kluczowe metody odziedziczone z object:
    • ToString() powinno zwracać "{Title} by {Author}"
    • Equals(object obj) powinno zwracać true, jeśli drugi obiekt jest typu Book i ma takie same właściwości Title i Author
    • GetHashCode() powinno łączyć kody skrótu obu właściwości
  • Program.cs: W głównym pliku utwórz dwie książki na podstawie wprowadzonych wartości. Wyświetl każdą książkę za pomocą ToString(), a następnie sprawdź, czy są równe, i wypisz wynik. Na koniec pokaż, że możesz przechowywać obiekt typu Book w zmiennej typu object i nadal uzyskać sensowny wynik po wywołaniu ToString().

Otrzymasz cztery dane wejściowe:

  • Tytuł pierwszej książki
  • Autor pierwszej książki
  • Tytuł drugiej książki
  • Autor drugiej książki

Wypisz wynik w tym formacie:

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}

Na przykład, jeśli dane wejściowe to 1984, George Orwell, 1984 i George Orwell, wynik powinien być następujący:

Book 1: 1984 by George Orwell
Book 2: 1984 by George Orwell
Are they equal? True
Stored as object: 1984 by George Orwell

Jeśli dane wejściowe to 1984, George Orwell, Brave New World i Aldous Huxley, wynik powinien być następujący:

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

Zwróć uwagę, że nadpisane metody nadają obiektom Book sensowne zachowanie — są ładnie wyświetlane jako tekst i można je porównywać na podstawie ich zawartości, a nie tylko referencji do miejsca w pamięci!

Spróbuj swoich sił

using System;
using Library;

class Program
{
    public static void Main(string[] args)
    {
        // Wczytaj dane wejściowe dotyczące dwóch książek
        string title1 = Console.ReadLine();
        string author1 = Console.ReadLine();
        string title2 = Console.ReadLine();
        string author2 = Console.ReadLine();

        // TODO: Utwórz dwa obiekty Book, używając wartości wejściowych

        // TODO: Wyświetl Book 1, używając ToString()
        // Format: "Book 1: {ToString result}"

        // TODO: Wyświetl Book 2, używając ToString()
        // Format: "Book 2: {ToString result}"

        // TODO: Sprawdź, czy książki są równe, i wyświetl wynik
        // Format: "Are they equal? {True/False}"

        // TODO: Zapisz pierwszą książkę w zmiennej typu object i ją wyświetl
        // Format: "Stored as object: {ToString result}"
    }
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator C# online