Interfaces en C#: contratos sin herencia múltiple

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

Resumen

Fortalece tu arquitectura en C# con un enfoque claro y práctico: polimorfismo, interfaces y colecciones para lograr una solución más robusta. Aquí verás cómo pasar de arreglos a colecciones y luego a diccionarios, crear contratos con interfaces y reutilizar código de forma profesional, todo desde Visual Studio Code.

¿Qué se logró en las etapas anteriores?

Durante cinco etapas se consolidó una base sólida orientada a objetos que facilita extender y mantener la solución.

  • Etapa 1: creación de la escuela con un bosquejo inicial basado en requerimientos definidos.
  • Etapa 2: incorporación de objetos como cursos y análisis de estructura y anidamiento de objetos.
  • Etapa 3: cambio de arreglos a colecciones para manipular objetos, incluidos los anidados.
  • Etapa 4: refactorización del código y generación de datos de prueba en volumen con estrategias aleatorias y producto cartesiano.
  • Etapa 5: reutilización de código con programación orientada a objetos, moviendo funcionalidades comunes a una clase padre abstracta (ObjetoEscuela).

Además, se añadió un printer que produce líneas y títulos, y funciones para listar todos los objetos de la escuela.

¿Cómo aplicar polimorfismo e interfaces en C#?

El objetivo es permitir que distintos objetos compartan comportamientos sin herencia múltiple. En C# no hay herencia múltiple; por eso, las interfaces actúan como contrato.

¿Por qué no usar herencia múltiple en C# y sí interfaces?

  • C# evita la herencia múltiple por su complejidad y propensión a errores.
  • Una interfaz define qué miembros debe exponer un objeto, sin implementación.
  • Convención en .NET: los nombres de interfaz inician con I, por ejemplo, ILugar.
  • En una interfaz, los miembros no llevan modificadores: se asumen públicos.

¿Cómo se define y usa ILugar para dirección y limpieza?

Se plantea una necesidad transversal: algunos objetos (Escuela, Curso) tienen dirección y pueden limpiar lugar.

  • Se crea la interfaz ILugar con una propiedad Dirección y un método LimpiarLugar.
  • ILugar es el contrato: cada clase que la implemente debe ofrecer esa estructura, sin importar la forma exacta de su lógica interna.
  • Se implementa en Escuela y Curso junto con la herencia de la clase base abstracta ObjetoEscuela.

¿Cómo se implementa ILugar en Escuela y Curso?

  • En Escuela: se agrega la propiedad Dirección y el método público LimpiarLugar.
  • En Curso: también se implementa ILugar; el IDE ayuda con Control + punto en Visual Studio Code para generar la plantilla de miembros.
  • Atención a la accesibilidad: si aparece “inaccesible por su nivel de protección”, el método debe ser público.
  • Implementación explícita de interfaz: útil cuando hay posibles conflictos de nombres, por ejemplo, si existiera otra interfaz como IGeolocalizado con otra Dirección.

¿Qué operaciones prácticas se construyen y qué viene en la etapa seis?

Se integra la interfaz con lógica real y se alista el cambio de estructura de datos para mayor robustez.

  • Uso de Printer: dibuja una línea estándar y apoya la salida de mensajes.
  • Limpieza en Curso: se imprime “limpiando establecimiento”, luego “curso [nombre] está limpio” con formato mediante Console.WriteLine.
  • Limpieza en Escuela: se imprime línea y mensajes de inicio y fin; adicionalmente, se recorren todos los cursos con foreach para ejecutar LimpiarLugar en cada uno.
  • Accesibilidad correcta: los métodos que implementan la interfaz deben ser públicos para permitir su invocación desde otros objetos.
  • Próximo paso de la etapa 6: pasar de lista a diccionario para habilitar nuevas operaciones y ofrecer listas pensadas para consumo externo.

¿Cómo mejora tu diseño con estos cambios?

  • Contratos claros con interfaces que separan el “qué” del “cómo”.
  • Polimorfismo simple y mantenible sin herencia múltiple.
  • Reutilización consistente desde una clase base abstracta.
  • Colecciones adecuadas: primero listas/colecciones, luego diccionarios más expresivos.
  • Apoyo del IDE para implementar interfaces rápido y sin errores.

¿Te gustaría comentar cómo estructurarías otros contratos (por ejemplo, notificación o geolocalización) o qué claves usarías al migrar a diccionarios?

      Interfaces en C#: contratos sin herencia múltiple