La herencia de clases en C# es un mecanismo que permite a una clase derivar de otra clase. Esto significa que “heredará” todos sus campos, propiedades y métodos.
La clase de la cual se hereda se conoce como clase base (o clase padre). Por otro lado, la clase que hereda se llama clase derivada (o clase hija).
Si quieres aprender más sobre Herencia entre clases
consulta el Curso de Programación Orientada a Objetos leer más
Implementación de la herencia
La herencia en C# se implementa utilizando dos puntos (:) seguida del nombre de la clase base.
public class ClaseBase
{
    // Miembros de la clase base
}
public class ClaseDerivada : ClaseBase
{
    // Miembros adicionales de la clase derivada
}Vamos a verlo mejor con un ejemplo sencillo,
public class Animal
{
    public void Comer()
    {
        Console.WriteLine("El animal está comiendo.");
    }
}
public class Perro : Animal
{
    public void Ladrar()
    {
        Console.WriteLine("El perro está ladrando.");
    }
}
// Uso
Perro miPerro = new Perro();
miPerro.Comer();  // Heredado de Animal
miPerro.Ladrar(); // Definido en PerroEn este ejemplo,
- La clase Perrohereda de la claseAnimal
- Esto significa que Perrotiene acceso a los métodos deAnimal, comoComer
- Además de sus propios métodos como Ladrar.
Sobrescritura de métodos
Las clases derivadas pueden sobrescribir métodos de la clase base utilizando las palabras clave virtual en la clase base y override en la clase derivada.
public class Animal
{
    public virtual void HacerSonido()
    {
        Console.WriteLine("El animal hace un sonido.");
    }
}
public class Perro : Animal
{
    public override void HacerSonido()
    {
        Console.WriteLine("El perro ladra.");
    }
}
// Uso
Animal miAnimal = new Animal();
miAnimal.HacerSonido(); // Salida: El animal hace un sonido.
Perro miPerro = new Perro();
miPerro.HacerSonido(); // Salida: El perro ladra.En este ejemplo, Perro sobrescribe el método HacerSonido de Animal para proporcionar una implementación específica.
Palabra clave base
La palabra clave base se utiliza para acceder a miembros de la clase base desde una clase derivada (como constructores, métodos y propiedades de la clase base).
public class Animal
{
    public string Nombre { get; set; }
    public Animal(string nombre)
    {
        Nombre = nombre;
    }
    public virtual void HacerSonido()
    {
        Console.WriteLine("El animal hace un sonido.");
    }
}
public class Perro : Animal
{
    public Perro(string nombre) : base(nombre)
    {
    }
    public override void HacerSonido()
    {
        base.HacerSonido(); // Invoca el método de la clase base
        Console.WriteLine("El perro ladra.");
    }
}
// Uso
Perro miPerro = new Perro("Fido");
miPerro.HacerSonido();
// Salida:
// El animal hace un sonido.
// El perro ladra.Constructores en clases derivadas
Cuando se crea una instancia de una clase derivada, el constructor de la clase base se invoca automáticamente antes que el constructor de la clase derivada.
Se puede especificar explícitamente qué constructor de la clase base se debe llamar usando la palabra clave base.
public class Animal
{
    public string Nombre { get; set; }
    public Animal(string nombre)
    {
        Nombre = nombre;
    }
}
public class Perro : Animal
{
    public string Raza { get; set; }
    public Perro(string nombre, string raza) : base(nombre)
    {
        Raza = raza;
    }
}
// Uso
Perro miPerro = new Perro("Fido", "Labrador");
Console.WriteLine($"Nombre: {miPerro.Nombre}, Raza: {miPerro.Raza}");
// Salida: Nombre: Fido, Raza: LabradorHerencia y polimorfismo
El polimorfismo es otra característica clave de la POO que se complementa con la herencia. Permite que una clase derivada sea tratada como una instancia de su clase base. Esto permite la sustituir objetos, pero que a la vez mantienen los métodos sobreescritos.
public class Gato : Animal
{
    public override void HacerSonido()
    {
        Console.WriteLine("El gato maúlla.");
    }
}
// Uso
Animal miAnimal;
miAnimal = new Perro("Fido");
miAnimal.HacerSonido(); // Salida: El perro ladra.
miAnimal = new Gato("Mishi");
miAnimal.HacerSonido(); // Salida: El gato maúlla.En este ejemplo,
- miAnimalpuede referirse a un- Perroo a un- Gato
- Se invoca al método HacerSonidoapropiado según el tipo de instancia (en tiempo de ejecución)
