Sobrescritura de ToString()
Parte de la sección Programación Orientada a Objetos del Journey de C# de Coddy — lección 38 de 70.
Cada clase en C# hereda de object, que proporciona un método ToString(). Por defecto, devuelve el nombre de tipo totalmente calificado; no es muy útil cuando quieres ver los datos reales de un objeto.
Puedes sobrescribir ToString() para devolver una representación de cadena significativa de tu objeto:
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)";
}
}Ahora, cuando imprimes o concatenas un objeto Person, obtienes una salida legible:
Person p = new Person("Alice", 30);
Console.WriteLine(p); // Alice (30 años)Sin la anulación, esto imprimiría algo como MyNamespace.Person. La palabra clave override es necesaria porque estás reemplazando el método heredado de object. Esto es especialmente valioso para la depuración y el registro, donde necesitas una visión rápida del estado de un objeto.
Desafío
FácilVamos a construir una clase Book que proporcione representaciones de cadena significativas cuando se imprima, haciendo que la depuración y la visualización de la información del libro sean mucho más intuitivas.
Organizarás tu código en dos archivos:
Book.cs: Crea una claseBooken el espacio de nombresLibraryque represente un libro con sus detalles esenciales. Tu libro debe tener:- Tres propiedades de solo lectura:
Title(string),Author(string) eYear(int) - Un constructor que acepte el título, el autor y el año en ese orden
- Un método
ToString()sobrescrito que devuelva una cadena formateada:"{Title}" by {Author} ({Year})
- Tres propiedades de solo lectura:
Program.cs: En tu archivo principal, crea un objetoBookutilizando los valores de entrada e imprímelo directamente. Gracias a tu sobrescritura deToString(), pasar el objeto del libro aConsole.WriteLine()mostrará automáticamente la información formateada en lugar del nombre del tipo.
Recibirás tres entradas:
- Título del libro (string)
- Nombre del autor (string)
- Año de publicación (integer)
Imprime el objeto del libro directamente usando Console.WriteLine().
Por ejemplo, si las entradas son The Great Gatsby, F. Scott Fitzgerald y 1925, la salida debería ser:
"The Great Gatsby" by F. Scott Fitzgerald (1925)La magia aquí es que no estás llamando a ToString() explícitamente: cuando pasas un objeto a Console.WriteLine(), este llama automáticamente al método ToString() del objeto. ¡Tu sobrescritura hace que esta salida sea útil en lugar de simplemente mostrar Library.Book!
Hoja de referencia
Cada clase en C# hereda de object, el cual proporciona un método ToString(). Por defecto, este devuelve el nombre completo del tipo (fully qualified type name).
Sobrescriba ToString() para devolver una representación de cadena significativa:
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)";
}
}Cuando imprime un objeto, se llama a ToString() automáticamente:
Person p = new Person("Alice", 30);
Console.WriteLine(p); // Alice (30 years old)La palabra clave override es obligatoria cuando se reemplaza un método heredado de object.
Pruébalo tú mismo
using System;
using Library;
class Program
{
public static void Main(string[] args)
{
// Leer la entrada
string title = Console.ReadLine();
string author = Console.ReadLine();
int year = Convert.ToInt32(Console.ReadLine());
// TODO: Crear un objeto Book usando los valores de entrada
// TODO: Imprimir el objeto book directamente usando Console.WriteLine()
}
}
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Programación Orientada a Objetos
1Fundamentos de OOP
Archivos externosNamespaces y directivasIntro a clases y objetosLa palabra clave 'this'Métodos y parámetrosCampos vs PropiedadesConstructoresInicializadores de objetosResumen - Calculadora simple4Herencia
Sintaxis básica de herencia (:)La palabra clave 'base'Palabras clave Virtual y OverrideClases selladas (Sealed)La clase base 'object'Resumen: Jerarquía de empleados7Características avanzadas
Sobrecarga de operadoresIndexadores (this[])Sobrescritura de ToString()Métodos de extensiónResumen - Lista personalizada10Patrones de diseño - Parte 1
Introducción a los patrones de diseñoSingleton Thread-SafePatrón FactoryPatrón Observer (Eventos)Patrón Strategy2Propiedades y miembros estáticos
Propiedades autoimplementadasPropiedades de solo lectura y escrituraCampos y métodos estáticosClases estáticasMiembros con cuerpo de expresión5Polimorfismo e Interfaces
Polimorfismo: Compilación vs. EjecuciónInterfaz vs. Clase AbstractaInterfaces MúltiplesInterfaces ExplícitasUpcasting y DowncastingRepaso: Calculadora de Figuras8Conceptos avanzados de POO
Composición sobre herenciaGenéricos (clases y métodos)Delegados y eventosAtributos y ReflexiónIDisposable y la sentencia usingFundamentos de Inyección de dependencias11Patrones de diseño, parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón Composite3Arquitectura de clases
Datos de instancia vs. estáticosPalabras clave 'readonly' y 'const'Campos de respaldoResumen - Gestor de cuentas bancarias6Encapsulamiento
Modificadores de accesoPropiedades para el encapsulamientoImplementación de ocultamiento de datosPatrones de inmutabilidadRepaso - Registros de estudiantes