Interfaz | Explicación Completa (Definición, uso, estructura y ejemplo con C#)
Tags: csharp, designpatterns, español
Published: 2023-06-27 00:50:31

Interfaz | Explicación Completa (Definición, uso, estructura y ejemplo con C#)

# Introducción

Hola buenas, mi nombre es Daniela Barazarte y te quiero dar la bienvenida a esta explicación completa sobre la interfaz. Esta explicación será intuitiva y simple así como todas las explicaciones que forman parte de #DetectaLaLogica.

Si prefieres los videos, aquí tienes un tutorial completo hecho por mí en YouTube, está en español pero también tiene subtítulos: https://www.youtube.com/watch?v=UbZORJzMQec

# <u>Teoría</u>
## Definición de cada palabra
**"Patrón de diseño"**
- **Patrón**: es un tipo de sucesos u objetos repetitivos
![Patrón de diseño](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/a8hizh9zs3bzgaimxs1n.png)
- **Diseño**: actividad creativa que tiene por fin proyectar objetos que sean útiles y estéticos

**"Interfaz"**
- **Interfaz**: zona de comunicación o acción de un sistema sobre otro
![Lapiz y papel representando la Interfaz](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pvjfyhfzef7eu2ncla6t.png)

## Definición completa
El patrón de diseño de interfaz es una especificación de métodos y propiedades que una clase debe proporcionar, y cualquier clase que implemente esa interfaz se compromete a proporcionar esos métodos y propiedades.

## #DetectaLaLógica
La palabra "Interfaz" se define como "zona de comunicación o acción de un sistema sobre otro". Al patrón de diseño de Interfaz se le llama así porque una interfaz se está comunicando con una clase para comunicarle que parámetros debe tener esa clase. Es como un contrato donde la interfaz declara que componentes tiene y la clase debe tener esos componentes también.

# <u>Uso</u>
## Para qué
La interfaz se utiliza para definir una interfaz común que puede ser implementada por varias clases diferentes. Este patrón permite a estas clases tener diferentes comportamientos mientras cumplen con una misma interfaz, lo que proporciona flexibilidad y modularidad a la aplicación.

## Cuando y cómo
- Al tener múltiples clases que deben cumplir con un conjunto específico de comportamientos 
- Al tener una estructura común para plugins o módulos externos que deben cumplir con un conjunto específico de comportamientos 
- Al crear una aplicación que debe ser compatible con diferentes arquitecturas de sistemas distribuidos 
- Al crear una aplicación que debe ser fácilmente extensible y modular

# <u>Práctica</u>
## Ejercicio
Tienes que crear un proyecto de consola donde tengas varios animales y puedas escribir en consola el sonido que hacen cada uno de ellos

### **Método: Interfaz**

![Interfaz](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/okqqp2esu4095a4742la.png)

**La parte naranja (arriba):** es una interfaz de Animal
**La parte azul (abajo):** son implementaciones de esa interfaz, en este caso, 3 animales (gato, perro, pájaro)

```
public interface IAnimal
{
    void HacerSonido();
    void LlamarAmigo();
}

public class Perro : IAnimal
{
    public void HacerSonido()
    {
        Console.WriteLine("¡Guau! Woof!");
    }
    public void LlamarAmigo()
    {
        Console.WriteLine("¡Ven amigo perro!");
    }
}

public class Gato : IAnimal
{
    public void HacerSonido()
    {
        Console.WriteLine("¡Miau! Meow!");
    }
    public void LlamarAmigo()
    {
        Console.WriteLine("¡Ven amigo gato!");
    }
}
public class Pajaro : IAnimal
{
    public void HacerSonido()
    {
        Console.WriteLine("¡Pío Pío! Quququ!");
    }

    public void LlamarAmigo()
    {
        Console.WriteLine("¡Ven amigo pájaro!");
    }
}
public class Program
{
    public static void Main()
    {
        IAnimal miGato = new Gato();
        IAnimal miPerro = new Perro();
        IAnimal miPajaro = new Pajaro();

        miGato.HacerSonido();
        miGato.LlamarAmigo();

        miPerro.HacerSonido();
        miPerro.LlamarAmigo();

        miPajaro.HacerSonido();
        miPajaro.LlamarAmigo();
    }
}
```

Tener una interfaz "Animal" que implementa a "Pajaro", "Perro" y "Gato" es beneficioso porque proporciona una abstracción útil que permite un alto nivel de flexibilidad y extensibilidad en el diseño de software. Al definir una interfaz "Animal", se establecen ciertos comportamientos y características que todos los animales deben tener, como por ejemplo, la capacidad de moverse y respirar.

Al implementar esta interfaz en "Pájaro", "Perro" y "Gato", se garantiza que todos ellos tengan estas características comunes y se puedan utilizar de manera intercambiable en el código que requiere un objeto "Animal". Esto permite que el código sea más modular y escalable, ya que se pueden agregar fácilmente nuevos tipos de animales que cumplan con la interfaz "Animal" sin tener que cambiar el código existente.

# Importancia
**El patrón de diseño interfaz tiene varios beneficios:**

- **Abstracción**: Las interfaces permiten definir un conjunto de métodos y propiedades que deben ser implementados por una clase que las implemente. Esto permite abstraer la implementación de una clase detrás de una interfaz, lo que facilita la comprensión y el mantenimiento del código.
- **Separación de preocupaciones**: Al definir interfaces, se puede separar claramente la interfaz de usuario de la lógica de negocio. Esto permite que las diferentes partes de una aplicación se comuniquen entre sí a través de interfaces bien definidas.
- **Polimorfismo**: Las interfaces permiten el polimorfismo, lo que significa que una clase que implementa una interfaz puede ser tratada como si fuera de ese tipo de interfaz. Esto permite que las clases que implementan la misma interfaz se utilicen de manera intercambiable en diferentes partes del código, lo que facilita la reutilización y el mantenimiento del código.

# Despedida
(Recuerda) #DetectaLaLógica: La palabra "Interfaz" se define como "zona de comunicación o acción de un sistema sobre otro". Al patrón de diseño de Interfaz se le llama así porque una interfaz se está comunicando con una clase para comunicarle que parámetros debe tener esa clase. Es como un contrato donde la interfaz declara que componentes tiene y la clase debe tener esos componentes también.


Puedes practicar este tema en mi repositorio de GitHub (Código en lenguaje C#): https://github.com/danielabarazarte/DetectaLaLogica

Muchas gracias por leer, si tienes alguna duda puedes comentarla y también puedes seguirme para ver mas posts de este estilo, gracias <3.