La clase base 'object'
Parte de la sección Programación Orientada a Objetos del Journey de C# de Coddy — lección 23 de 70.
En C#, cada clase que creas hereda automáticamente de una clase especial llamada object. Incluso cuando no especificas explícitamente una clase base, tu clase sigue teniendo a object como su ancestro final. Esto significa que cada tipo en C# comparte un conjunto común de métodos.
La clase object proporciona varios métodos virtuales que puedes sobrescribir en tus propias clases:
public class Person
{
public string Name { get; set; }
// Sobrescribir de 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;
}
}Los tres métodos que se sobrescriben con más frecuencia son ToString() para la representación de cadenas, Equals() para comparar objetos, y GetHashCode() para colecciones basadas en hash. Por defecto, ToString() devuelve el nombre del tipo, y Equals() comprueba la igualdad de referencia.
Debido a que todo hereda de object, puedes almacenar cualquier tipo en una variable object:
object item1 = new Person { Name = "Alice" };
object item2 = 42;
object item3 = "Hello";
Console.WriteLine(item1.ToString()); // Person: AliceEsta clase base universal es lo que hace posible características como las colecciones que contienen tipos mixtos, y es por eso que cada objeto en C# tiene acceso a métodos como ToString() y GetType().
Desafío
FácilVamos a construir un sistema de comparación de libros que demuestre cómo sobrescribir métodos de la clase base object otorga a tus tipos personalizados un comportamiento significativo para la representación de cadenas y la comprobación de igualdad.
Crearás dos archivos para organizar tu código:
Book.cs: Define una claseBooken el espacio de nombresLibrary. Tu libro debe tener las propiedadesTitle(string) yAuthor(string), junto con un constructor que establezca ambos valores. Sobrescribe los tres métodos clave heredados deobject:ToString()debe devolver"{Title} by {Author}"Equals(object obj)debe devolvertruesi el otro objeto es unBookcon el mismoTitleyAuthorGetHashCode()debe combinar los códigos hash de ambas propiedades
Program.cs: En tu archivo principal, crea dos libros utilizando valores de entrada. Muestra cada libro usandoToString(), luego verifica si son iguales e imprime el resultado. Finalmente, demuestra que puedes almacenar unBooken una variable de tipoobjecty seguir obteniendo una salida significativa al llamar aToString().
Recibirás cuatro entradas:
- Título del primer libro
- Autor del primer libro
- Título del segundo libro
- Autor del segundo libro
Imprime la salida en este formato:
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}Por ejemplo, si las entradas son 1984, George Orwell, 1984 y George Orwell, la salida debería ser:
Book 1: 1984 by George Orwell
Book 2: 1984 by George Orwell
Are they equal? True
Stored as object: 1984 by George OrwellSi las entradas son 1984, George Orwell, Brave New World y Aldous Huxley, la salida debería ser:
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¡Observa cómo tus métodos sobrescritos otorgan a los objetos Book un comportamiento significativo: se muestran de forma agradable como cadenas y pueden compararse por su contenido en lugar de solo por sus referencias de memoria!
Hoja de referencia
En C#, cada clase hereda automáticamente de la clase object, la cual proporciona varios métodos virtuales que pueden ser sobrescritos:
Métodos comunes de Object para sobrescribir
ToString()- Devuelve una representación en cadena del objeto (por defecto devuelve el nombre del tipo)Equals(object obj)- Compara objetos para verificar la igualdad (por defecto verifica la igualdad de referencia)GetHashCode()- Devuelve un código hash para su uso en colecciones basadas en hash
Sobrescribir métodos de Object
public class Person
{
public string Name { get; set; }
// Sobrescribir ToString para una representación en cadena personalizada
public override string ToString()
{
return $"Person: {Name}";
}
// Sobrescribir Equals para una comparación basada en el contenido
public override bool Equals(object obj)
{
if (obj is Person other)
return Name == other.Name;
return false;
}
// Sobrescribir GetHashCode para colecciones basadas en hash
public override int GetHashCode()
{
return Name?.GetHashCode() ?? 0;
}
}Clase base universal
Cualquier tipo puede ser almacenado en una variable object:
object item1 = new Person { Name = "Alice" };
object item2 = 42;
object item3 = "Hello";
Console.WriteLine(item1.ToString()); // Person: AliceEsta herencia universal permite colecciones que contienen tipos mixtos y asegura que cada objeto tenga acceso a métodos como ToString() y GetType().
Pruébalo tú mismo
using System;
using Library;
class Program
{
public static void Main(string[] args)
{
// Leer la entrada para dos libros
string title1 = Console.ReadLine();
string author1 = Console.ReadLine();
string title2 = Console.ReadLine();
string author2 = Console.ReadLine();
// TODO: Crear dos objetos Book utilizando los valores de entrada
// TODO: Imprimir el Libro 1 usando ToString()
// Formato: "Book 1: {ToString result}"
// TODO: Imprimir el Libro 2 usando ToString()
// Formato: "Book 2: {ToString result}"
// TODO: Comprobar si los libros son iguales e imprimir el resultado
// Formato: "Are they equal? {True/False}"
// TODO: Almacenar el primer libro en una variable de objeto e imprimirlo
// Formato: "Stored as object: {ToString result}"
}
}
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