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: AliceTa 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().
Wyzwanie
ŁatwyZbudujmy 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ęBookw przestrzeni nazwLibrary. Twoja książka powinna mieć właściwościTitle(string) iAuthor(string), a także konstruktor, który ustawia obie wartości. Nadpisz trzy kluczowe metody odziedziczone zobject:ToString()powinno zwracać"{Title} by {Author}"Equals(object obj)powinno zwracaćtrue, jeśli drugi obiekt jest typuBooki ma takie same właściwościTitleiAuthorGetHashCode()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 typuBookw zmiennej typuobjecti nadal uzyskać sensowny wynik po wywołaniuToString().
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 OrwellJeś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 OrwellZwróć 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}"
}
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy programowania obiektowego
Pliki zewnętrznePrzestrzenie nazw i dyrektywyWprowadzenie do klas i obiektówSłowo kluczowe „this”Metody i parametryPola a właściwościKonstruktoryInicjalizatory obiektówPodsumowanie — prosty kalkulator4Dziedziczenie
Podstawowa składnia dziedziczenia (:)Słowo kluczowe 'base'Słowa kluczowe virtual i overrideKlasy sealedBazowa klasa 'object'Powtórzenie – hierarchia pracowników7Zaawansowane funkcje
Przeciążanie operatorówIndeksery (this[])Nadpisywanie ToString()Metody rozszerzającePodsumowanie – własna lista2Właściwości i składowe statyczne
Właściwości automatyczneWłaściwości tylko do odczytu i zapisuPola i metody statyczneKlasy statyczneSkładowe z ciałem wyrażeniowym5Polimorfizm i interfejsy
Polimorfizm czasu kompilacji a czasu wykonaniaInterfejs a klasa abstrakcyjnaWiele interfejsówJawne implementowanie interfejsówRzutowanie w górę i w dółPowtórka — kalkulator kształtów8Zaawansowane koncepcje OOP
Kompozycja zamiast dziedziczeniaTypy generyczne (klasy i metody)Delegaty i zdarzeniaAtrybuty i refleksjaIDisposable i instrukcja usingPodstawy wstrzykiwania zależności11Wzorce projektowe, część 2
Wzorzec poleceniaWzorzec adapteraWzorzec dekoratoraWzorzec metody szablonowejWzorzec stanuWzorzec kompozytu3Architektura klas
Dane instancji a dane statyczneSłowa kluczowe 'readonly' i 'const'Pola zapasowePowtórzenie — menedżer kont bankowych6Hermetyzacja
Modyfikatory dostępuWłaściwości w hermetyzacjiImplementacja ukrywania danychWzorce niezmiennościPowtórka — dane studentów9Argumenty zmiennej liczby
Słowo kluczowe „params”Parametry opcjonalneArgumenty nazwanePrzeciążanie metodPoćwicz samodzielnie: Kompilator C# online