Herencia para reutilizar código C#

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

Resumen

Aprende a reutilizar código en C# con programación orientada a objetos: renombrar entidades correctamente, organizar evaluaciones por alumno, evitar listas nulas y sentar las bases de herencia para eliminar duplicación. Verás cómo depurar en Visual Studio y mejorar la eficiencia con listas genéricas.

¿Cómo corregir y organizar las evaluaciones en C#?

Elegir una estructura clara evita errores y simplifica la lógica. Primero, corrige el nombre de la entidad: usa singular “Evaluación”. En Visual Studio, emplea “renombrar símbolo” para actualizar referencias de forma segura. Mantén consistencia incluso en el nombre del archivo.

  • Nombres de entidades en singular para coherencia.
  • Corrección con “renombrar símbolo” en Visual Studio.
  • Decisión de diseño: las evaluaciones viven en el alumno.

Implementa que cada alumno sea portador de su propia lista. Así logras una doble referencia: cada Evaluación conoce a su Alumno, y cada Alumno tiene su lista de Evaluaciones. Esto facilita consultas por alumno o por evaluación.

public class Evaluación
{
    public string Nombre { get; set; }
    public Alumno Alumno { get; set; }
    public float Nota { get; set; }
    public string Asignatura { get; set; }
}

public class Alumno
{
    public string Nombre { get; set; }
    public string Id { get; set; } // id único
    public List<Evaluación> Evaluaciones { get; set; } = new List<Evaluación>();
}

Claves prácticas: - Inicializa la lista para evitar null. - Genera evaluaciones aleatorias por alumno. - Mantén la referencia Evaluación.Alumno al momento de crear cada evaluación.

¿Cómo se asignan las evaluaciones al alumno?

Puedes agregar una por una o usar un enfoque más eficiente con AddRange.

// Opción 1: agregar una por una
foreach (var alumno in curso.Alumnos)
{
    for (int i = 0; i < 5; i++)
    {
        var ev = new Evaluación { Alumno = alumno /* ... */ };
        alumno.Evaluaciones.Add(ev);
    }
}

// Opción 2: más eficiente con AddRange
foreach (var alumno in curso.Alumnos)
{
    var lote = new List<Evaluación>();
    for (int i = 0; i < 5; i++)
    {
        var ev = new Evaluación { Alumno = alumno /* ... */ };
        lote.Add(ev);
    }
    alumno.Evaluaciones.AddRange(lote);
}

Resultado esperado: si hay 4 asignaturas y creas 5 evaluaciones por asignatura, cada alumno acumula 20 evaluaciones.

¿Cómo evitar errores comunes y depurar con seguridad?

Durante la asignación, el fallo típico es: la lista Evaluaciones es nula. La solución: inicializa la propiedad en su declaración o en el constructor. Con eso, la colección existe aunque esté vacía.

  • Inicializa listas genéricas desde el inicio.
  • Revisa referencias antes de agregar.
  • Usa debug paso a paso para validar el flujo.

Pasos de depuración en Visual Studio: - Coloca un breakpoint en la sección donde asignas evaluaciones. - Entra al método de inicialización del engine. - Verifica que Evaluación.Alumno se asigne dentro del bucle. - Inspecciona Alumno.Evaluaciones para confirmar el conteo tras cada iteración.

Patrón seguro para listas:

public class Alumno
{
    public List<Evaluación> Evaluaciones { get; set; } = new List<Evaluación>();
}

Beneficios inmediatos: - Evitas excepciones por referencia nula. - Aseguras la doble referencia entre Alumno y Evaluación. - Aceleras el llenado con AddRange cuando generas lotes.

¿Cómo reducir duplicación con herencia en POO?

Si Alumno, Asignatura, Curso y Escuela comparten “Id único” y “Nombre”, estás repitiendo lógica. La herencia resuelve esto: crea una clase base con lo común y haz que las demás hereden. Así centralizas la responsabilidad y facilitas el mantenimiento.

  • Extrae propiedades compartidas a una clase base.
  • Hereda en entidades concretas para reutilizar código.
  • Mantén una sola fuente de verdad para el Id único y el nombre.

Ejemplo orientativo:

public abstract class EntidadBase
{
    public string Id { get; set; }
    public string Nombre { get; set; }
}

public class Alumno : EntidadBase
{
    public List<Evaluación> Evaluaciones { get; set; } = new List<Evaluación>();
}

public class Asignatura : EntidadBase { }
public class Curso : EntidadBase { }
public class Escuela : EntidadBase { }

Ventajas claras: - Menos duplicación y menos errores. - Estandarización del Id único y del nombre. - Código más legible y fácil de extender.

¿Tienes otra forma de estructurar las evaluaciones o la clase base? Comparte tus dudas o mejoras en los comentarios.