Clases Abstractas y Sealed
Una clase abstracta es un contrato parcial: define estructura y puede tener código implementado, pero también puede tener métodos abstract (sin cuerpo) que las subclases deben implementar obligatoriamente. No puedes crear un objeto de una clase abstracta directamente; es como un molde que solo sirve para crear moldes más específicos.
Una interfaz es un contrato puro sin nada implementado (antes de C# 8). La regla práctica: clase abstracta cuando hay comportamiento compartido, interfaz cuando defines solo capacidades.
La palabra clave sealed hace lo contrario a abstract: previene que alguien herede de esa clase. Es útil para clases utilitarias (como una clase de constantes) donde la herencia no tiene sentido, o para optimizar el rendimiento (el compilador puede hacer optimizaciones cuando sabe que no hay subclases). En métodos, sealed override previene que subclases sobreescriban ese método específico. String en .NET es sealed: no puedes crear tu propia subclase de String.
// Clase abstracta
public abstract class Figura {
// Propiedad abstracta - sin implementación
public abstract double Area { get; }
public abstract double Perimetro { get; }
// Método abstracto
public abstract string Describir();
// Método concreto (heredado)
public void MostrarInfo() {
Console.WriteLine($"Área: {Area:F2}");
Console.WriteLine($"Perímetro: {Perimetro:F2}");
}
}
// Implementación concreta
public class Circulo : Figura {
public double Radio { get; }
public Circulo(double radio) => Radio = radio;
public override double Area => Math.PI * Radio * Radio;
public override double Perimetro => 2 * Math.PI * Radio;
public override string Describir() => $"Círculo de radio {Radio}";
}
public class Rectangulo : Figura {
public double Ancho { get; }
public double Alto { get; }
public Rectangulo(double ancho, double alto) {
Ancho = ancho;
Alto = alto;
}
public override double Area => Ancho * Alto;
public override double Perimetro => 2 * (Ancho + Alto);
public override string Describir() => $"Rectángulo {Ancho}x{Alto}";
}
// sealed - no se puede heredar de esta clase
public sealed class Constantes {
public const double Pi = 3.14159;
public const double E = 2.71828;
}
// Uso polimórfico
Figura[] figuras = { new Circulo(5), new Rectangulo(4, 6) };
foreach (var f in figuras) {
Console.WriteLine(f.Describir());
f.MostrarInfo();
}
Practica esta lección
Resuelve los ejercicios del curso de C# en la app, gratis y con corrección automática.
Empezar a practicar