- Si queremos que nuestra clase sea INSTANCIADA pero que no fuera posible **HEREDAR de ella ** debemos utilizar el tipo de clase SEALED (Clase sellada).
- Si queremos que nuestra clase sea HEREDADA pero que no fuera posible INSTANCIARLA debemos utilizar el tipo de clase ABSTRACT (clase abstracta)
Recursos
Resumen
La herencia en C# permite un diseño más limpio y mantenible: reduces código redundante, centralizas comportamientos en una clase base y controlas quién puede instanciar u heredar. Aquí verás cómo crear un objeto base reutilizable, corregir errores de namespace y GUID, y aplicar clases abstractas y clases selladas en Visual Studio Code con debug y build.
¿Qué es herencia y cómo se aplica en c#?
La herencia replica la idea real: un “padre” transmite atributos y métodos a sus “hijos**.** Un objeto padre puede exponer todo o reservar comportamientos para que el hijo los implemente. Esto habilita la sobreescritura de métodos: por ejemplo, definir un método caminar y exigir que cada hijo lo implemente a su manera.
- Centraliza campos comunes: Unique ID y Nombre se mueven a un objeto base.
- Define la inicialización del ID en un único lugar: dentro del constructor.
- Elimina duplicados: Alumno, Asignatura, Curso, Escuela y Evaluación heredan y borran sus copias locales.
Ejemplo de objeto base con inicialización desde el constructor:
using System; // Base reutilizable para todos los objetos del dominio. abstract class ObjetoEscuelaBase { public string Nombre { get; set; } public Guid UniqueId { get; } public ObjetoEscuelaBase() { UniqueId = Guid.NewGuid(); } }
Clases que heredan y simplifican su código:
class Alumno : ObjetoEscuelaBase { // Propiedades específicas, por ejemplo: evaluaciones. } class Asignatura : ObjetoEscuelaBase { } class Curso : ObjetoEscuelaBase { } class Escuela : ObjetoEscuelaBase { } class Evaluacion : ObjetoEscuelaBase { }
Validación práctica con debug: se ejecuta, se recorre la inicialización, se crean entidades y se imprimen resultados. Si aparecen errores, se revisa el editor y se corrigen.
¿Cómo controlar instanciación y herencia con clases abstractas y selladas?
Para evitar usos incorrectos, se definen modificadores que expresan la intención del diseño.
- Clase abstracta: se puede heredar, pero no instanciar. Ideal para “solo idea” o contrato base.
- Clase sellada: se puede instanciar, pero no heredar. Útil cuando no debe extenderse.
Aplicación directa:
- El objeto base se marca como abstracto: nadie puede crear “nuevo ObjetoEscuelaBase”, pero todos pueden heredar de él.
- EscuelaEngine se marca sellada: se puede instanciar para operar el motor, pero no permite subclases.
abstract class ObjetoEscuelaBase { /* ... */ } sealed class EscuelaEngine { // Lógica de orquestación del dominio. } // Error de compilación: no se puede heredar de una clase sellada. // class Dummy : EscuelaEngine { } // Herencia permitida desde la base abstracta. class Dummy : ObjetoEscuelaBase { }
Este control evita mal uso del modelo: la base es una idea compartida, el engine es una implementación cerrada.
¿Qué problemas comunes se resolvieron y qué sigue con polimorfismo?
Durante la ejecución aparecieron errores visibles en el editor. La solución se centró en dependencias y espacios de nombres.
- Falta de namespace para GUID: se agrega la directiva correspondiente y se corrigen puntos y comas sobrantes.
- Namespace incorrecto en la base: se ajusta para alinear a “Core Escuela” y desaparecen los errores.
- Verificación por consola:
dotnet build
- Prueba con debug: se recorre la carga de Escuela, Cursos, Asignaturas y Evaluaciones; luego se imprime el resultado.
Habilidades y conceptos reforzados:
- Refactorización por herencia: mover atributos y constructores al padre.
- Inicialización en el constructor: asignar el Unique ID una sola vez.
- Sobreescritura de métodos: reservar comportamientos para que cada hijo los implemente.
- Clases abstractas y selladas: controlar instanciación y extensibilidad.
- Diagnóstico de errores: corregir namespaces, compilar con build y validar con debug.
- Polimorfismo (avance): un Alumno puede tratarse como ObjetoEscuelaBase, pero no al revés. Se profundizará con ejemplos prácticos.
¿Con qué casos aplicarías herencia, clases abstractas o selladas en tu proyecto? Comparte tus dudas y ejemplos para analizarlos juntos.