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();
}
Practica esta lección
Resuelve los ejercicios del curso de C# en la app, gratis y con corrección automática.
Empezar a practicar