Implementación de interfaces en C#


Una técnica imprescindible para lograr un adecuado nivel de abstracción es la utilización de interfaces.

Hablando en llano, una interfaz no es más que una estructura de datos que muestra únicamente las firmas de los métodos de una clase. A partir de ahí, una clase que herede de la interfaz estará obligada a “rellenar” la implementación de dichos métodos. De forma simple, una interfaz sería algo así:

Interfaz Motor
    Arrancar();
    Detener();

Esta interfaz únicamente dice QUÉ acciones se van a realizar, pero no CÓMO se realizarán. Para saber cómo realizarlas, crearemos clases que implementen esta interfaz, obligando a “rellenar” el contenido de los métodos que declaramos previamente.

Por poner un ejemplo:

Clase Gasolina : Motor
    Arrancar()
        InyectarAire();
        IniciarCarburacion();
        EncenderMezcla(Bujía);
    Detener()
        DetenerCarburacion();

Clase Diesel : Motor
    Arrancar()
        InyectarCombustible();
        InyectarAire();
        Comprimir();
    Detener()
        DetenerInyeccion();

Ahora imaginemos que tenemos una clase “Coche” que necesite un “Motor”. Esta clase debe ignorar el funcionamiento interno del motor, únicamente debe saber cómo arrancarlo y cómo pararlo.

Clase Vehiculo
    Motor m;

Para ello hará uso de los métodos Arrancar() y Parar(). Esta interfaz será donde se “conecte” el motor, independientemente de si es un Gasolina o un Diesel. Por ello, si quisiéramos utilizar un motor Diesel, haríamos lo siguiente:

m = new Diesel();
    m.Arrancar();

Como podemos observar, para un motor gasolina sería igual, salvo que declararíamos una instancia de la clase Gasolina.

Implementando una interfaz en C#

Como ejemplo de implementación y utilización de interfaces en C#, crearemos una interfaz ITest que implemente dos métodos: HolaMundo y DevolverCadena. Esta interfaz será implementada por dos clases: Minusculas y Mayusculas. La primera devolverá cadenas en minúsculas, mientras que la segunda, lo hará en mayúsculas.
Para comenzar, crearemos tres clases: ITest, Minusculas y Mayusculas. Estableceremos el cuerpo de ITest de la siguiente forma:


using System;
using System.Collections.Generic;
using System.Text;

namespace Simple.Interface
{
    public interface ITest
    {
        string HolaMundo();
        string DevolverCadena(string s);
    }
}

Así de simple. Establecemos los nombres de las funciones junto a sus parámetros (sin establecer niveles de visibilidad, como public, protected o private). Hecho esto, tenemos declarada una interfaz.

El segundo paso será crear nuestras clases que la implementen. Comenzaremos por “Minusculas“. Lo único que deberemos hacer será añadir dos puntos tras el nombre de la clase, y a continuación, el nombre de la clase o interfaz de la que hereda, en nuestro caso, ITest.


using System;
using System.Collections.Generic;
using System.Text;

namespace Simple.Interface
{
    public class Minusculas : ITest
    {

    }
}

Acto seguido, haremos click derecho sobre “ITest” y seleccionaremos la opción “Implementar interfaz”.

090501ImplementarInterfaz

Con esto se añadirán automáticamente a nuestro código aquellos elementos que necesiten ser implementados.


#region Miembros de ITest

public string HolaMundo()
{
    throw new Exception("The method or operation is not implemented.");
}

public string DevolverCadena(string s)
{
    throw new Exception("The method or operation is not implemented.");
}

#endregion

Por último, sustituiremos las sentencias throw por nuestro propio código, que será el siguiente:


#region Miembros de ITest

public string HolaMundo()
{
    return ("hola, mundo");
}

public string DevolverCadena(string s)
{
    return s.ToLower();
}

#endregion

Con la clase Mayusculas realizaremos la misma operación, solo que la implementación será la siguiente:


#region Miembros de ITest

public string HolaMundo()
{
    return ("HOLA, MUNDO");
}

public string DevolverCadena(string s)
{
    return s.ToUpper();
}

#endregion

Ahora deberemos probar nuestro código. En un proyecto de aplicación de consola, declararemos una referencia a nuestra interfaz (lo que equivaldría una referencia al Motor en el primer ejemplo).

Hecho esto, le asociamos una instancia de cualquiera de las clases que la implementen:


ITest minusculas = new Minusculas();
ITest mayusculas = new Mayusculas();

Console.WriteLine(minusculas.HolaMundo());
Console.WriteLine(mayusculas.HolaMundo());

Console.WriteLine("------------------------------------------------");

Console.WriteLine(minusculas.DevolverCadena("Esto es una Prueba de INTERFACES"));
Console.WriteLine(mayusculas.DevolverCadena("Esto es una Prueba de INTERFACES"));

Como observaremos a continuación, nuestra interfaz ITest conoce los métodos que tiene, pero no cómo ejecutarlos. Es por ello que, al asociarle una instancia que implemente la interfaz, nuestra referencia se comportará de una forma u otra.

090502Ejemplo

Imaginemos la potencia de la utilización de interfaces a la hora de crear, por ejemplo, conexiones a bases de datos. Este será un tema que veremos con posterioridad.

Anuncios

14 comments

  1. Me encanta tu manera de explicar las cosas.
    La manera en que explicas el ejemplo aplicado a la vida diaria y después lo expliques de manera a código es excepcional, clara concisa y puntual. ¡Felicidades por el Blog!

  2. Hola, yo quiero agregar un comentario en la interfaz para que luego los programadores que la implementen tengan alguna guia rapida o documentacion respecto de cosas puntuales. Hay forma que los comentarios que yo agrego a la Interfaz se vean automaticamente al implementarla como por ej. un metodo.?

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s