Uso de Interfaces y Polimorfismo en Visual Studio Code

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

Resumen

Aprende a usar interfaces en C# para aplicar polimorfismo de forma segura, filtrar colecciones con LINQ y evitar errores silenciosos en runtime. Aquí verás cómo pasar de una implementación básica a consultas por tipo, reforzando la idea de interfaz como contrato y diferenciándola de la herencia.

¿Cómo usar interfaces para limpiar la escuela con C#?

La implementación de la interfaz permite ejecutar acciones comunes en objetos distintos. Al invocar la limpieza desde el núcleo, se llama al método de la escuela y a sus cursos, confirmando que la interfaz estandariza el comportamiento sin importar el tipo concreto.

  • Se invoca la limpieza: engine.escuela.limpiar.
  • Se agrega feedback con bip al finalizar: tres pitidos.
  • Se ajusta la frecuencia del bip: primero muy alta, luego grave a 1000 Hz.
  • Se enfatiza el evento importante con printer.title: «Escuela Platzi Academy limpia».

Código orientativo:

// Disparar la rutina de limpieza
engine.Escuela.Limpiar();

// Feedback al finalizar
printer.Beep(frecuencia: 1000, duracionMs: 500, repeticiones: 3);
printer.WriteTitle("Escuela Platzi Academy limpia.");

¿Qué valida el log de limpieza?

  • Limpieza de cursos: 101, 102, 103.
  • Mensaje final de establecimiento: «Escuela Platzi limpia» y luego «Escuela Platzi Academy limpia».
  • Confirmación audible: pitidos solo al terminar para evitar ruido innecesario.

¿Por qué destacar el final con title?

  • Es un hito del proceso: toda la escuela quedó limpia.
  • Mejora la lectura del flujo y reduce mensajes perdidos.

¿Cómo filtrar con LINQ y evitar errores silenciosos?

Al crear una lista desde “todos los objetos” de la escuela, un casting directo a ILugar puede romper en ejecución si hay tipos que no implementan la interfaz. El problema: errores silenciosos, datos inconsistentes y ejecución “aparentemente” normal.

Código riesgoso:

var listaILugar = listaObjetos
    .Select(o => (ILugar)o) // Puede fallar: no todos son ILugar
    .ToList();

Solución segura: filtrar antes de convertir usando la condición de tipo. Así, la query trae únicamente objetos válidos (escuela y cursos) y el casting es seguro.

var listaILugar = listaObjetos
    .Where(o => o is ILugar)
    .Select(o => (ILugar)o)
    .ToList();

¿Por qué el casting directo falla?

  • No todos los objetos comparten la interfaz ILugar.
  • El casting genera excepciones y resultados inconsistentes.
  • Es un error silencioso: la app puede seguir sin alertar claramente.

¿Qué condición usar con where?

  • where con verificación de tipo: o is ILugar.
  • Beneficio: la query retorna solo los objetos que cumplen la interfaz.
  • Resultado esperado: escuela y cursos como 101, 201, 202, etc.

¿Qué es una interfaz como contrato y cómo aplicarla al polimorfismo?

Una interfaz es un contrato: indica lo que un tipo debe tener, no cómo implementarlo. A diferencia de la herencia (que transmite comportamiento), la interfaz garantiza mínimos y habilita polimorfismo sin acoplarse a clases concretas.

  • Interfaces: agrupan objetos por capacidades comunes.
  • Herencia: comparte implementación, como en ObjetoEscuela.
  • Contrato: asegura métodos/propiedades sin definir su lógica.

¿Cómo consultar solo alumnos sin crear interfaces?

No necesitas nuevas interfaces para cada consulta. Puedes filtrar por tipo concreto y luego convertir, obteniendo, por ejemplo, solo alumnos (p. ej., 56 creados aleatoriamente para el escenario):

var alumnos = listaObjetos
    .Where(o => o is Alumno)
    .Select(o => (Alumno)o)
    .ToList();

¿Cómo entender interfaz, clase abstracta y clase como “formas de verse”?

  • Interfaz real: ILugar, contrato explícito.
  • Clase abstracta: puede funcionar como interfaz desde la perspectiva de uso.
  • Clase concreta: también puede “verse” como interfaz cuando se consulta por su forma visible.
  • Práctica clave: verificar si un objeto “se ve como” otro tipo o interfaz, y actuar en consecuencia.

¿Tienes dudas o quieres compartir cómo aplicas LINQ y polimorfismo en tus proyectos? Deja tu comentario y enriquezcamos la discusión juntos.