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.
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 SI puede tener campos. Propiedades que el objeto que implemente la interfaz deberá tener.
no, no pueden tener segun esto
Dejo un ejemplo de Linq con lambda
var listaIlugar = lstObjetos.Where(x=> x is ILugar).ToList();
De esta manera devolverá una colección de ObjetoEscuelaBase, Faltaría hacer el casteo a ILugar
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...
Estoy de acuerdo, no hay que mezclar conceptos, aunque su sintaxis sea similar. Todos los cursos de C# que he visto en la web (excepto uno) dicen que las interfaces permiten herencia múltiple y eso es incorrecto. Esto confunde bastante.
De todas maneras está bien utilizado el ejemplo de este video en el sentido de que una clase puede implementar lo definido en dos o más interfaces.
Lo primero que se me viene a la cabeza con el nombre de interfaz, es un Frame como en JAVA.
Recuerdo cuando en la preparatoria estabamos estudiando Java, y dijeron que mirariamos el tema de Interfaces, pensaba que ya hariamos GUIs para interactuar, pero no, hablaban de este concepto :(
Llevo bastante tiempo utilizando POO, sin embargo, hasta ahora me queda claro el concepto de interfaz. Mil gracias!
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?
En la clase Abstracta se pueden implementar métodos que las clases hijas pueden usar sin volver a escribir todo el código. En la Interfaz se dice qué métodos va a tener la clase, pero no dice cómo se implementan. Solo es un contrato que varias clases pueden suscribir aunque no sean de la misma familia
te dice exactamente cual curso se esta limpiando xD
publicvoidClearAddress(){Printer.PrintText($"Cleaning {name}");Printer.PrintText($"The {name} have been cleared successfully");}
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.
Puedes compartir la implementaciòn de la interface. Para verificar el código fuente.
Y sin embargo, no me salta un error en el ide y tampoco me obliga a tenerlo el metodo CleanPlace, solo me exige que tenga las propiedades.
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.
Las interfaces no heredan comportamiento, heredan un contrato que se debe garantizar que se cumple.
Muy interesante ejemplo de filtrar objetos que hereden de una interfaz y al hacer el casteo de un objeto a una interfaz hace posible acceder/Utilizar los métodos y propiedades de la interfaz como si fuese una clase normal.
zaz, tuve que ver los videos 4 veces para entender las interfaces
jajajajaj A mi me pasó eso en la 2da clase, tuve que verme la resolucion del reto del curso anterior
Obtener solo los objetos que cumplan con una condición. Interfaces.
No se si alguien pueda ayudarme, pero quisiera saber si saben como solucionar este problema:
Resulta que clone el repositorio, pero al abrirlo en vs code no me marca los errores, al menos no todos, por ejemplo en esta parte
Ahi no me marca el error que no estoy implementando todos los elementos de la interface
Esto unicamnete me pasa con repositorios clonados.
Osea mi problema es que vscode no lo reconoce el error ni me deja usar el comando de Cntrl+.
Me paso algo parecido en mi caso me hacia falta una extensión del lenguaje la descargue y luego hice dotnet build y listo!
Minuto 8:44 Por que hay que convertir el objeto a que se de tipo Alumno, si ya con el Where estoy realizando el filtrado de objetos que deseo?
Esto se hace a modo de Cast, en el where estoy filtrando pero en el select estoy indicando que es lo que quiero asignar a mi variable como tal.
No es necesario hacer el casting en ese lugar, si remueves el casting el código funciona y te muestra los datos como si fueran ObjetoEscuelaBase
¡Hola! Si han usado nodemon con node.js o han usado liveserver para aplicaciones con HTML, pueden ejecutar el siguiente comando para que se ejecute el programa cada vez que se guarde o se detecte algún cambio en los archivos:
dotnet watch run
Si como yo, lo tienen en otro directorio el código, lo pueden ejecutar también así:
dotnet watch run --project src
Uso de where con LINQ, para filtrar objetos de una lista por una condición. Similar a SQL pero con listas