Практическое руководство. Переопределение метода ToString (руководство по программированию на C#)
Каждый класс или структура в языке C# неявно наследует класс Object. Поэтому каждый объект в языке C# получает метод ToString, который возвращает строковое представление данного объекта. Например, все переменные типа int имеют метод ToString , который позволяет им возвращать их содержимое в виде строки:
int x = 42; string strx = x.ToString(); Console.WriteLine(strx); // Output: // 42
При создании пользовательского класса или структуры необходимо переопределить метод ToString, чтобы передать информацию о типе клиентскому коду.
Дополнительные сведения об использовании строк форматирования и других типов пользовательского форматирования с методом ToString см. в разделе Типы форматирования.
При принятии решения относительно того, какая информация должна будет предоставляться посредством этого метода, подумайте, будет ли создаваемый класс или структура когда-либо использоваться ненадежным кодом. Постарайтесь не предоставлять информацию, которая может быть использована вредоносным кодом.
Чтобы переопределить метод ToString в классе или структуре, выполните указанные ниже действия.
-
Объявите метод ToString со следующими модификаторами и типом возвращаемого значения:
public override string ToString()<>
class Person < public string Name < get; set; >public int Age < get; set; >public override string ToString() < return "Person: " + Name + " " + Age; >>
Метод ToString можно проверить с помощью показанного ниже кода.
Person person = new Person < Name = "John", Age = 12 >; Console.WriteLine(person); // Output: // Person: John 12
См. также
- IFormattable
- Руководство по программированию на C#
- Система типов C#
- Строки
- string
- override
- virtual
- Типы форматирования
Совместная работа с нами на GitHub
Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.
The .NET documentation is open source. Provide feedback here.
Обратная связь
Отправить и просмотреть отзыв по
Переопределение метода toString();
Доброго времени суток, объясните пожалуйста, зачем нужно переопределять метод toString() чтобы вывести параметры объекта?
Вот без переопределения:
1 2 3 4 5 6 7 8 9 10 11
public class Main { public static void main(String[] args){ Friend obj1 = new Friend(); obj1.name = "Андрей"; System.out.println(obj1.toString()); } } class Friend { String name; }
А вот с переопределением:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
public class Main { public static void main(String[] args){ Friend obj1 = new Friend(); obj1.name = "Сергей"; System.out.println(obj1.toString()); } } class Friend { String name; @Override public String toString(){ return name; } }
Ладно переопределение методов в наследование я понимаю, то вот в данном примере, не могу понять, почему без переопределение, выводится только хэшкод класса.
Лучшие ответы ( 2 )
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Переопределение метода compare интерфейса Comparator
Добрый день. Нужно имплементировать класс Comparator и переопределив класс compare реализовать.

Переопределение метода toString()
Никак не могу разобраться с переопределение метода toString(), помогите, пожалуйста. Вот небольшая.
Переопределение toString для вывода List
Как в данном случае переопределить toString public class DBtoList < private int id; .
Реализации метода String toString()
Всем привет!! вот такое задание нужно сделать: Добавьте в классы помещений Flat и Office.
3540 / 2144 / 566
Регистрация: 02.09.2015
Сообщений: 5,435

Сообщение было отмечено Gastello как решение
Решение
Сообщение от Gastello 
почему без переопределение, выводится только хэшкод класса.
Потому что вызывается родительский метод класса Object.
735 / 512 / 58
Регистрация: 10.03.2012
Сообщений: 3,727
Сообщение от Gastello 
Ладно переопределение методов в наследование я понимаю, то вот в данном примере, не могу понять, почему без переопределение, выводится только хэшкод класса.
Потому что метод toString наследуется от класса Object
Регистрация: 11.04.2010
Сообщений: 530
То есть без переопределения, toString сам по себе не может вывести информацию об Объекте?
237 / 89 / 24
Регистрация: 07.01.2023
Сообщений: 354

Сообщение было отмечено Gastello как решение
Решение
Сообщение от Gastello 
То есть без переопределения, toString сам по себе не может вывести информацию об Объекте?
Может. Но эта информация будет неиформативной для пользователя
3540 / 2144 / 566
Регистрация: 02.09.2015
Сообщений: 5,435
Сообщение от Gastello 
toString сам по себе не может вывести информацию об Объекте?
Так выводит же:
return getClass().getName() + "@" + Integer.toHexString(hashCode());
?
И что ты ожидаешь увидеть, если класс Object понятия не имеет о твоем классе Friend?
P. S. Если лениво переопределять метод toString, то Lombok в помощь, ну или сгенерь его в IDE.
735 / 512 / 58
Регистрация: 10.03.2012
Сообщений: 3,727
Сообщение от Gastello 
System.out.println(obj1.toString());
Кстати в System.out.println метод toString итак неявно вызывается.
Регистрация: 11.04.2010
Сообщений: 530
Сообщение от Whitecolor 
Кстати в System.out.println метод toString итак неявно вызывается.
Да я уже понял, достаточно просто переопределение.
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь
Переопределение метода
Добрый Вечер. Объясните Пожалуйста поподробнее, что обозначет: "переопределение метода" .
Переопределение метода Java
Здравствуйте. Нужна помощь в переопределение метода по задаче. Программа работает, но.
Переопределение метода equals
В Хорстмане приводится следующий код, как пример переопределения метода equals(): public class.
Переопределение метода(класса)
Задание: написать класс прогрессии в которой каждый следующий элемент равняется квадратному корню.

Переопределение метода equals
При проверки выскакивает исключение Exception in thread "main" java.lang.NullPointerException.

Где ошибка. Переопределение метода
Все отрабатывает без ошибок, переопределение метода не работает. IDE Eclipse. Java 8. 1. Супер.
Переопределение метода в другом классе
Помогите пожалуйста! Проблема в следующем. Есть всем известный класс: public class MainActivity.
Override the toString Method in Java

We often use strings in Java as they are an essential part of every program. In this tutorial, we will see how we can override the tostring() method in Java using an easy example to understand the concept better.
Override the toString() Method Using the @Override Annotation in Java
The toString() method is a part of the Object class which is a superclass of every class in Java. It means that every class has its own toString() method. But we don’t get the desired output from the default toString() method every time. It is when we have to override the method and customize it according to our needs.
To demonstrate how to override the toString() method, we will see two examples, one without overriding the toString() method and another that has the method overridden.
In the below example, we have a class ExampleClass with three variables that are initialized in a constructor. When we create an object of the ExampleClass class with the arguments passed and then print the object, we get the object that is not meaningful and not readable for humans. It is because, when print exampleClass , its default toString() is called. But we want to print the values of the variables as a string. To do this, we will override the toString() method in the next example.
public class OverrideToString public static void main(String[] args) ExampleClass exampleClass = new ExampleClass("Alex", "Novel", 24); System.out.println(exampleClass); > > class ExampleClass String firstName; String lastName; int age; ExampleClass(String firstName, String lastName, int age) this.firstName = firstName; this.lastName = lastName; this.age = age; > >
ExampleClass@37bba400
In the following code, we take the same example as before, but this time we override the toString() method using the @Override annotation and write the method name as toString() with a return type of String . We can do this manually or we can use shortcuts that are included in many IDEs.
As the method returns a String, we have to construct it. We concatenate the variables with String to make a single String. At last, when we create an object of exampleClass and print it, we get the output as a String with the values of the variables passed. It happens because we override the toString() method to specify our own implementation.
public class OverrideToString public static void main(String[] args) ExampleClass exampleClass = new ExampleClass("Alex", "Novel", 24); System.out.println(exampleClass); > > class ExampleClass String firstName; String lastName; int age; ExampleClass(String firstName, String lastName, int age) this.firstName = firstName; this.lastName = lastName; this.age = age; > @Override public String toString() return "firstName='" + firstName + '\'' + ", lastName='" + lastName + '\'' + ", age=" + age; > >
firstName='Alex', lastName='Novel', age=24
Rupam Saini is an android developer, who also works sometimes as a web developer., He likes to read books and write about various things.
Related Article — Java Override
Переопределение в Kotlin
Наследование в Kotlin начинается не с объявления программистом какого-то класса родительским. Уже самый первый родительский класс является наследником общего для всех суперкласса Any . Это наследование происходит по-умолчанию, поэтому его можно не указывать. В случае явного указания заголовок класса выглядит примерно так:
class NumInc(n: Int, gap: Int): Any() { .
Поскольку дочерние классы наследуют свойства и функции родительского, то все, что есть у Any , есть у всех остальных классов. Не важно, непосредственно это класс-наследник или наследник наследника.
Класс Any включает три функции-члена – equals() , toString() , hashСode() . Если мы создадим пустой класс, у его объектов все-равно будут методы, унаследованные от Any :
fun main() { val a = Days() val b = Days() println(a.equals(b)) // или a == b println(a.hashCode()) println(b.hashCode()) println(a.toString()) println(a) } class Days {}
Пример выполнения программы:
false 1018547642 1456208737 Days@3cb5cdba Days@3cb5cdba
Метод toString() в данном случае можно не вызывать, так как функция println() делает это сама. Этот метод отвечает за преобразование объекта, каких-то данных о нем, к строке. Он должен возвращать строку. В классе Any запрограммирован возврат строки, содержащей имя класса и через «собаку» по всей видимости адрес объекта в памяти. Нас может не устраивать такое положение дел, лучше бы, чтобы toString() выводит что-нибудь более полезное.
Для этого нам потребуется переопределить в нашем классе функцию-член родительского класса. Это значит, что мы создаем в своем классе метод с таким же именем, что и в родительском, а тело метода пишем свое. И когда объект будет вызывать этот метод, будет использована функция-член своего класса, а не родительского.
Если в классе начать писать имя метода родительского класса, то IntelliJ IDEA сама предложит его для переопределения.

После подтверждения код класса будет выглядеть так:
open class NumInc(n: Int, gap: Int) { var number = n var step = gap fun inc() {number += step} fun dec() {number -= step} override fun toString(): String { return super.toString() } }
Слово override говорит, что данная функция переопределяет родительскую. String после двоеточия – тип возвращаемых функцией данных, должна возвращаться строка.
В теле автоматически сгенерированной функции происходит обращение к одноименной функции-члену родительского класса. Происходит это через ключевое слово super , которое обозначает родительский класс. Из него мы получаем строку, строка возвращается в функцию toString() класса NumInc , а уже отсюда с помощью return она передается в место, откуда вызывался данный метод.
В таком варианте, несмотря на то, что мы переопределили функцию в дочернем классе, ничего не изменилось. Как по большому счету выполнялось тело функции родительского класса, так оно и будет выполняться. Просто вызов идет не напрямую, а опосредовано через дочерний класс.

Пусть мы хотим, чтобы метод toString() возвращал информацию о текущих значениях свойств объектов. Для этого в теле метода удалим вызов аналогичного метода родительского класса и напишем свое тело:
open class NumInc(n: Int, gap: Int) { var number = n var step = gap fun inc() {number += step} fun dec() {number -= step} override fun toString(): String { val n = "number = $number" val s = "step = $step" return "$n \n $s" } }
Если main будет таким,
fun main() { val a = NumInc(0, 1) val b = NumInc(12, 2) println(a.toString()) println(b) }
результат выполнения таким.
number = 0 step = 1 number = 12 step = 2
Мы можем переопределять не только методы класса Any , но и своего родительского в его дочернем. Пусть нам нужен класс подобный NumInc , но функции inc() и dec() которого уменьшают и увеличивают number на двойной шаг. В этом случае, если этот класс будет дочерним от NumInc , нам придется переопределить функции inc() и dec() :
class NumDouble(n: Int, gap: Int): NumInc(n, gap) { override fun inc() { number += step * 2 } override fun dec() { number -= step * 2 } }
Однако мы не сможем этого сделать до тех пор, пока в родительском классе не разрешим переопределять методы с этими именами. Для этого следует объявить как открытые с помощью слова open :
open class NumInc(n: Int, gap: Int) { var number = n var step = gap open fun inc() {number += step} open fun dec() {number -= step} . }
Другими словами, в Kotlin, чтобы иметь возможность переопределять методы, недостаточно, чтобы их класс был открытым. Необходимо дополнительно указывать такую возможность для каждого метода. По-умолчанию методы вместо модификатора open имеют модификатор final . Мы его не пишем.
Однако, если дочерний класс переопределяет метод родительского, то в нем open не пишется. Вместо этого стоит override . При этом метод остается открытым. Если у дочернего будет свой дочерний, то он сможет переопределить такой метод. Если требуется исключить возможность дальнейшего переопределения, то перед override пишут final .

В примере на скрине мы объявили класс NumDouble открытым и создали от него дочерний NumD2 . В нем мы можем переопределить метод inc() и не можем сделать это с dec() , потому что в NumDouble объявили метод финальным.
Бывает так, что код переопределяемого метода не сильно отличается от того, что используется в родительском классе. Нам нужно его лишь дополнить. В этом случае из тела метода дочернего класса, вызывается родительский метод через слово super . После того, как он возвращает поток выполнения в метод дочернего класса, здесь выполняется дополнительный код. Подобное мы уже видели, переопределяя toString() .
Давайте сделаем это в нашем классе NumDouble , хотя в данном случае большого смысла в этом нет. Тело класса очень простое.
open class NumDouble(n: Int, gap: Int): NumInc(n, gap) { override fun inc() { super.inc() number += step } override fun dec() { super.dec() number -= step } }
Здесь мы изменяем number на один шаг через родительский метод, потом делаем это еще раз уже в дочернем.
Следует отметить, что переопределять можно не только функции-члены класса, но и свойства. Однако нельзя изменить их тип. Поэтому такое переопределение обычно имеет место, когда используются инициирующие значения для полей, и в дочернем классе эти значения должны быть не такими, каковы они в родительском.
open class NumInc { open var number = 0 open var step = 1 open fun inc() {number += step} open fun dec() {number -= step} } open class NumDouble: NumInc() { override var number = 1 override var step = 2 }
Практическая работа:
Пусть свойство step родительского класса NumInc имеет сеттер, проверяющий число на неравенство нулю (нулевой шаг недопустим). В дочернем классе NumDouble такая проверка не нужна. Наследуется ли сеттер, следует ли его переопределять?
X Скрыть Наверх
Введение в объектно-ориентированное программирование на Kotlin
