Переопределение ToString()
Часть раздела Объектно-ориентированное программирование путешествия по C# на Coddy — урок 38 из 70.
Каждый класс в C# наследуется от object, который предоставляет метод ToString(). По умолчанию он возвращает полное имя типа — это не очень полезно, когда вы хотите увидеть фактические данные объекта.
Вы можете переопределить ToString(), чтобы возвращать осмысленное строковое представление вашего объекта:
public class Person
{
public string Name { get; }
public int Age { get; }
public Person(string name, int age)
{
Name = name;
Age = age;
}
public override string ToString()
{
return $"{Name} ({Age} years old)";
}
}Теперь при выводе или конкатенации объекта Person вы получаете читаемый вывод:
Person p = new Person("Alice", 30);
Console.WriteLine(p); // Алиса (30 лет)Без переопределения это вывело бы что-то вроде MyNamespace.Person. Ключевое слово override необходимо, потому что вы заменяете унаследованный метод из object. Это особенно полезно для отладки и логирования, когда вам нужно быстро получить представление о состоянии объекта.
Задание
ЛегкоДавайте создадим класс Book, который предоставляет осмысленное строковое представление при выводе на печать, что делает отладку и отображение информации о книге гораздо более интуитивно понятными.
Вы организуете свой код в двух файлах:
Book.cs: Создайте классBookв пространстве именLibrary, который представляет книгу с ее основными данными. Ваша книга должна иметь:- Три свойства только для чтения:
Title(string),Author(string) иYear(int) - Конструктор, который принимает название, автора и год именно в таком порядке
- Переопределенный метод
ToString(), который возвращает отформатированную строку:"{Title}" by {Author} ({Year})
- Три свойства только для чтения:
Program.cs: В основном файле создайте объектBook, используя входные значения, и выведите его напрямую. Благодаря переопределениюToString(), передача объекта книги вConsole.WriteLine()автоматически отобразит отформатированную информацию вместо имени типа.
Вы получите три входных значения:
- Название книги (string)
- Имя автора (string)
- Год издания (integer)
Выведите объект книги напрямую, используя Console.WriteLine().
Например, если на вход подаются The Great Gatsby, F. Scott Fitzgerald и 1925, результат должен быть следующим:
"The Great Gatsby" by F. Scott Fitzgerald (1925)Магия здесь в том, что вы не вызываете ToString() явно — когда вы передаете объект в Console.WriteLine(), он автоматически вызывает метод ToString() этого объекта. Ваше переопределение делает этот вывод полезным вместо того, чтобы просто показывать Library.Book!
Шпаргалка
Каждый класс в C# наследуется от object, который предоставляет метод ToString(). По умолчанию он возвращает полное имя типа.
Переопределите ToString(), чтобы возвращать осмысленное строковое представление:
public class Person
{
public string Name { get; }
public int Age { get; }
public Person(string name, int age)
{
Name = name;
Age = age;
}
public override string ToString()
{
return $"{Name} ({Age} years old)";
}
}При выводе объекта на печать ToString() вызывается автоматически:
Person p = new Person("Alice", 30);
Console.WriteLine(p); // Alice (30 years old)Ключевое слово override требуется при замене унаследованного метода из object.
Попробуйте сами
using System;
using Library;
class Program
{
public static void Main(string[] args)
{
// Чтение входных данных
string title = Console.ReadLine();
string author = Console.ReadLine();
int year = Convert.ToInt32(Console.ReadLine());
// TODO: Создать объект Book, используя введенные значения
// TODO: Вывести объект book напрямую с помощью Console.WriteLine()
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыПространства имен и директивыВведение в классы и объектыКлючевое слово 'this'Методы и параметрыПоля и свойстваКонструкторыИнициализаторы объектовИтоги — Простой калькулятор4Наследование
Основы синтаксиса наследования (:)Ключевое слово 'base'Ключевые слова Virtual и OverrideЗапечатанные классыБазовый класс 'object'Итоги — Иерархия сотрудников7Продвинутые возможности
Перегрузка операторовИндексаторы (this[])Переопределение ToString()Методы расширенияПовторение — Пользовательский список10Паттерны проектирования. Часть 1
Введение в паттерны проектированияПотокобезопасный SingletonПаттерн FactoryПаттерн Observer (События)Паттерн Strategy13Финальные испытания
Платформа для онлайн-обученияКомпонент игрового персонажаСервис аренды транспорта2Свойства и статические члены
Автоматически реализуемые свойстваСвойства только для чтения и записиСтатические поля и методыСтатические классыЧлены в виде выражений5Полиморфизм и интерфейсы
Полиморфизм: компиляция vs выполнениеИнтерфейс vs абстрактный классМножественные интерфейсыЯвные интерфейсыUpcasting и DowncastingИтоги: Калькулятор фигур8Продвинутые концепции ООП
Композиция вместо наследованияGenerics (классы и методы)Делегаты и событияАтрибуты и рефлексияIDisposable и оператор usingОсновы Dependency Injection11Паттерны проектирования. Часть 2
Паттерн КомандаПаттерн АдаптерПаттерн ДекораторПаттерн Шаблонный методПаттерн СостояниеПаттерн Компоновщик3Архитектура классов
Экземплярные и статические данныеКлючевые слова 'readonly' и 'const'Опорные поляПовторение — Менеджер банковских счетов6Инкапсуляция
Модификаторы доступаСвойства для инкапсуляцииРеализация скрытия данныхПаттерны неизменяемостиИтоги — Записи студентов9Переменное количество аргументов
Ключевое слово 'params'Необязательные параметрыИменованные аргументыПерегрузка методов