Sintaxis básica de herencia (:)
Parte de la sección Programación Orientada a Objetos del Journey de C# de Coddy — lección 19 de 70.
La herencia permite que una clase adquiera las propiedades y los métodos de otra clase. En lugar de reescribir el mismo código, se crea una clase base (padre) con funcionalidad compartida y, a continuación, se crean clases derivadas (hijas) que heredan de ella.
En C#, se utiliza el símbolo de dos puntos : para indicar herencia:
public class Animal
{
public string Name { get; set; }
public void Eat()
{
Console.WriteLine($"{Name} is eating.");
}
}
public class Dog : Animal
{
public void Bark()
{
Console.WriteLine($"{Name} says Woof!");
}
}La clase Dog hereda todo de Animal. Tiene acceso a la propiedad Name y al método Eat() sin declararlos de nuevo, además de que añade su propio método Bark():
Dog myDog = new Dog();
myDog.Name = "Buddy";
myDog.Eat(); // Salida: Buddy está comiendo.
myDog.Bark(); // Salida: Buddy dice ¡Guau!C# admite únicamente la herencia simple, lo que significa que una clase solo puede heredar de una única clase base. Sin embargo, se pueden construir cadenas de herencia en las que una clase derivada se convierte en la base de otra clase. Esto crea una jerarquía que modela relaciones del mundo real mientras mantiene el código organizado y reutilizable.
Desafío
FácilVamos a construir una jerarquía de vehículos que demuestre cómo la herencia permite que las clases derivadas compartan la funcionalidad de una clase base mientras agregan sus propios comportamientos únicos.
Crearás tres archivos para organizar tu código:
Vehicle.cs: Define una claseVehicleen el espacio de nombresTransport. Esta será tu clase base que todos los vehículos comparten. Debe tener una propiedadBrand(string) y una propiedadYear(int), junto con un métodoStartEngine()que imprima"{Brand} engine started."Car.cs: Define una claseCaren el espacio de nombresTransportque herede deVehicle. El coche añade su propia propiedadNumberOfDoors(int) y un métodoHonk()que imprima"{Brand} goes Beep Beep!"Program.cs: En tu archivo principal, crea una instancia deCarutilizando valores de entrada. Establece sus propiedades (incluidas las heredadas), luego demuestra que el coche puede usar tanto sus propios métodos como los métodos que heredó deVehicle.
Recibirás tres entradas:
- Nombre de la marca (Brand)
- Año (Year)
- Número de puertas (Number of doors)
Imprime la información del coche y demuestra sus capacidades en este formato:
Car: {Brand} ({Year})
Doors: {NumberOfDoors}
{StartEngine output}
{Honk output}Por ejemplo, si las entradas son Toyota, 2022, y 4, la salida debería ser:
Car: Toyota (2022)
Doors: 4
Toyota engine started.
Toyota goes Beep Beep!Observa cómo tu Car puede acceder a la propiedad Brand y al método StartEngine() a pesar de que están definidos en Vehicle. ¡Ese es el poder de la herencia: la clase derivada obtiene automáticamente todo de su clase base!
Hoja de referencia
La herencia permite que una clase adquiera propiedades y métodos de otra clase utilizando el símbolo de dos puntos ::
public class Animal
{
public string Name { get; set; }
public void Eat()
{
Console.WriteLine($"{Name} is eating.");
}
}
public class Dog : Animal
{
public void Bark()
{
Console.WriteLine($"{Name} says Woof!");
}
}La clase derivada (Dog) hereda todas las propiedades y métodos de la clase base (Animal) y puede añadir los suyos propios:
Dog myDog = new Dog();
myDog.Name = "Buddy";
myDog.Eat(); // Método heredado
myDog.Bark(); // Método propioC# solo admite la herencia simple: una clase solo puede heredar de una única clase base. Sin embargo, se pueden crear cadenas de herencia para construir jerarquías.
Pruébalo tú mismo
using System;
using Transport;
class Program
{
public static void Main(string[] args)
{
// Leer entrada
string brand = Console.ReadLine();
int year = Convert.ToInt32(Console.ReadLine());
int doors = Convert.ToInt32(Console.ReadLine());
// TODO: Crear una instancia de Car
// TODO: Establecer las propiedades del coche (Brand, Year, NumberOfDoors)
// TODO: Imprimir la información del coche en el formato requerido:
// Car: {Brand} ({Year})
// Doors: {NumberOfDoors}
// Luego llamar a StartEngine() y Honk()
}
}
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