Interfaces, explicadas con 🍐s y 🍎s

Un ejemplo practico en C#

Jonathan Batres
4 min readMar 1, 2021

El caso

Imagina que debes formar una banda con tres músicos y cada uno debe tocar un instrumento: El primero la guitarra, el segundo el bajo y el tercero la batería. Además, al llamar a cada uno al escenario deberás decir su nombre y país de origen para que él (o ella) aparezca triunfalmente y ejecute un solo en su instrumento. El programa debe correr en consola.

La solución

OK ¿Por donde comenzamos? Pues, analizando la situación por supuesto. Pensemos, por ejemplo, en un músico que toca una guitarra que, como todos sabemos, es un instrumento musical. Es decir: Una guitarra es un tipo de instrumento musical. Sí piensas en un piano, un violín o un tambor puedes visualizarlo fácilmente ¿No es así? Pero un instrumento musical no es algo concreto sino más bien una definición (“Objeto compuesto por la combinación de uno o más sistemas resonantes construido con el fin de producir sonido”)

Sabemos que todos los instrumentos musicales producen sonido (obvio) pero cada uno lo hace “a su manera”. La definición formal dice que un instrumento musical DEBE producir sonido pero no especifica COMO debe hacerlo y así, precisamente, es como funcionan las interfaces porque ellas definen comportamientos y establecen contratos que las clases que las implementan deben cumplir sí o sí.

Para definir una interface en C# utilizamos la palabra interface y, por convención, siempre colocamos una [ I ] antes del nombre. En este caso nuestra interface se llama IInstrumentoMusical y contiene el método ProducirSonido el cual no recibirá parámetros y devolverá un string.

Ahora, creamos nuestra clase Guitarra la cual implementará la interface IInstrumentoMusical. Toda clase que implementa una interface está obligada por contrato a implementar todos los métodos de dicha interface. En este caso la clase Guitarra debe crear su propia definición para el método ProducirSonido y lo hace “a su manera” haciendo el sonido: “RING-RING-RING

Lo mismo ocurre con la clase Bajo que también implementa la interface IInstrumentoMusical y devuelve su propio sonido: “TUMB-TUMB-TUMB”

Igual con la clase Bateria

¡Bien hecho! Ahora todos nuestros instrumentos musicales producen sonido 🙂🎵 Es momento de concentrarnos en la clase Musico. Recuerda que al llamar a cada integrante de la banda debemos decir su nombre y país de origen, por tanto, es necesario definir esas propiedades (1) las cuales serán inicializadas mediante el constructor (2) de la clase. También crearemos los métodos (3) TocarGuitarra, TocarBajo y TocarBateria. En este punto es importante notar que:

  • El método TocarGuitarra necesita un objeto del tipo Guitarra para acceder al método ProducirSonido (de guitarra)
  • El método TocarBajo necesita un objeto del tipo Bajo para acceder al método ProducirSonido (de bajo)
  • El método TocarBateria necesita un objeto del tipo Bateria para acceder al método ProducirSonido (de batería)

Nuestra clase Musico queda de la siguiente manera:

Ahora solo nos resta dirigimos al Main de la clase Program, crear 3 músicos con sus respectivos nombres y países de origen para finalmente hacer que cada uno toque su instrumento. Así:

¡Finalmente estamos listos para el concierto! Ejecutamos nuestro programa y… Obtenemos esta hermosa salida en consola: 😀🎸😄🪕😆🥁

Conclusiones

Utilizar interfaces para desarrollar nuestros programas nos ayuda a “basarnos en lo abstracto y no en lo concreto” eso es uno de los pilares de la POO. Realizamos el análisis de la situación, identificamos el elemento abstracto y lo modelamos como una interface:

Primero, definimos que todo instrumento musical produce sonido.

Después, creamos los instrumentos concretos (guitarra, batería, bajo) y definimos como cada uno produce un sonido particular.

Posteriormente, implementamos métodos para que el músico toque cada uno de los instrumentos.

Y finalmente, orquestamos todo en la clase Program.

La estructura del proyecto es la siguiente: Una interface, 3 clases que implementan dicha interface, una clase principal que utiliza las 3 clases previamente creadas y la clase Program desde donde ejecutamos el método Main.

Puntos importantes 🎯

  • Una interface define comportamientos y establece contratos para las clases que la implementan.
  • Si una clase utiliza una interface esta debe implementar todos los métodos definidos en dicha interface.
  • Cuando una clase implementa una interface se convierte en “un tipo de” dicha interface. Por ejemplo: La Guitarra (class) es un tipo de instrumento musical (interface)

--

--

Jonathan Batres
Jonathan Batres

No responses yet