Inicio > Cursos > C# > Herencia e Interfaces
C#POO en C#Lección 13 de 20

Herencia e Interfaces

La herencia en C# permite que una clase "hija" reutilice todo el código de una clase "padre" y lo extienda. La palabra clave virtual en el padre marca métodos que los hijos pueden sobreescribir con override. El modificador sealed en el hijo evita que sus propias subclases sobreescriban ese método específico.

C# solo permite heredar de una clase, pero puedes implementar múltiples interfaces, que son contratos de "ser capaz de hacer algo" sin código específico (aunque C# 8+ permite métodos default en interfaces).

El polimorfismo es el poder de tratar objetos diferentes como si fueran del mismo tipo base. Si tienes Animal[] y lo llenas de Perro, Gato y Pato, foreach (var animal in animales) { animal.HacerSonido() } llama automáticamente al sonido correcto de cada uno en tiempo de ejecución. Esto permite escribir código genérico que funciona con cualquier subclase actual o futura.

El operador is permite verificar el tipo en runtime y hacer narrowing: if (animal is IVolador volador) puedes llamar volador.Volar() de forma segura.

// Clase base
public class Animal {
    public string Nombre { get; set; }
    public int Edad { get; set; }
    
    public Animal(string nombre, int edad) {
        Nombre = nombre;
        Edad = edad;
    }
    
    public virtual string HacerSonido() => "...";
    public virtual void Describir() => Console.WriteLine($"Soy {Nombre}");
}

// Herencia con override
public class Perro : Animal {
    public string Raza { get; set; }
    
    public Perro(string nombre, string raza) : base(nombre, 0) {
        Raza = raza;
    }
    
    public override string HacerSonido() => "¡Woof!";
    
    public override void Describir() {
        base.Describir(); // Llama al padre
        Console.WriteLine($"Soy un {Raza}");
    }
}

// Interfaces
public interface IVolador {
    void Volar();
    int AlturaMaxima { get; } // Propiedad de interfaz
}

public interface INadador {
    void Nadar();
}

// Implementar múltiples interfaces
public class Pato : Animal, IVolador, INadador {
    public int AlturaMaxima => 100;
    
    public Pato(string nombre) : base(nombre, 1) { }
    
    public override string HacerSonido() => "¡Quack!";
    public void Volar() => Console.WriteLine("El pato vuela");
    public void Nadar() => Console.WriteLine("El pato nada");
}

// Polimorfismo
Animal[] animales = { new Perro("Rex", "Labrador"), new Pato("Donald") };
foreach (var animal in animales) {
    Console.WriteLine(animal.HacerSonido()); // Llama al override correcto
}

// Verificar tipo
if (animales[1] is IVolador volador) {
    volador.Volar();
}
Consejo🎯 Principio: "programa para interfaces, no para implementaciones". Esto hace tu código más flexible y testeable.
← Clases, Propiedades y ConstructoresClases Abstractas y Sealed →

Practica esta lección

Resuelve los ejercicios del curso de C# en la app, gratis y con corrección automática.

Empezar a practicar