Herencia y Polimorfismo en Programación Orientada a Objetos

Clase 3 de 35Curso de C# con .Net Core 2.1

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.