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 limpiezaengine.Escuela.Limpiar();// Feedback al finalizarprinter.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 isILugar).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 isAlumno).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.
Uso de Interfaces y Polimorfismo en Visual Studio Code
Uso de Interfaces y Polimorfismo en Visual Studio Code
Recursos
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.
C# INTERFACE
In C#, Interface cannot have access specifier for functions. It is public by default.
En C#, Interface no puede tener especificador de acceso a funciones, es PUBLICO por defecto.
C# ABSTRACT CLASS
In C#, abstract class can have access specifier for functions.
En # La Clase abstracta puede tener especificador de acceso para funciones.
2) Implementation 2) Implementación
C# INTERFACE
In C#, an interface can only have signature not the implementation.
En C#, una interface solo puede tener firma o declaraciones pero no la implementación.
C# ABSTRACT CLASS
Abstract class can provide complete implementation.
Una clase abstracta puede proporcionar una implementación completa en su definición.
3) Speed 3) Velocidad
C# INTERFACE
Interface is comparatively slow.
Interface es comparativamente lento.
C# ABSTRACT CLASS
Abstract class is fast.
Clase abstracta es rápida.
4) Instantiate 4) Instanciamiento
C# INTERFACE
Interface is absolutely abstract and cannot be instantiated.
la interfaz es absolutamente abstracta y no puede ser instanciada.
C# ABSTRACT CLASS
Abstract class cannot be instantiated.
La clase abstracta no puede ser instanciada.
5) Fields 5) Campos
C# INTERFACE
Interface cannot have fields.
La interfaz no puede tener campos.
C# ABSTRACT CLASS
Abstract class can have defined and constants.
La clase abstracta puede tener campos definidos y constantes.
6) Methods 6) Métodos
C# INTERFACE
Interface has only abstract methods.
La interfaz solamente tiene métodos abstractos.
C# ABSTRACT CLASS
Abstract class can have non-abstract methods.
La clase abstracta puede tener métodos no abstractos.
la interfaz no es lo mismo que la herencia, la herencia valga la redundancia hereda atributos, mientras que la interfaz es una especie de contrato o condición de implementar requisitos de acuerdo a una estructura o modelo predispuesto en la interfaz...
me ha costado mucho entender cuando debo implementar una interfaz y cuando una clase abstracta mi pregunta es: en aplicación
cuando conviene una y cuando la otra?
Porque cuando creo una Interface, cuando voy a mi clase y la agrego me pide que implemente las propiedades(bien) pero no me pide nada sobre los métodos?
Es como sino supiera que existen, quitándole la gracia porque no me obliga a tener que implementar el método.
Gracias, ésta es otra de las clases muy buenas. hacer querys de linq por medio de interfaces es algo que común mente no se hace, pero viendo la clase es de gran utilidad. si a alguien aún no le queda claro un uso concreto de las interfaces, les sugiero leer un poco la teoría de WCF de .net donde se ven varios conceptos como ServiceContract (interface) DataContract (campo o propiedad de una interface) y OperationContract (método definido en la interface del servicio). Ya cuando vi todo eso funcionando en conjunto me quedó 100% claro la utilidad de una interface.
El error silencioso se debe a que en la consulta LinQ no se hace un ToList() al final de la consulta.
Seria algo asi (from obj in listaObjetos where obj is ILugar select (ILugar) obj).ToList() ahi aparecería el error que dice el instructor.