# Interfaces
## Definición

Una Interfaz es una colección de miembros abstractos relacionados semánticamente. Una interfaz representa un comportamiento que una clase dada puede soportar.
El número de miembros de una interfaz dependen del comportamiento que queramos soportar, por ejemplo todos los objetos que sean móviles podrían querer soportar los métodos acelerar y frenar.
Según la interfaz de C# una interfaz sería:
También podríamos declarar dentro de la interfaz una propiedad que nos permita leer y/o escribir la velocidad que queremos que tome nuestro objeto.
Dado que una interfaz es una colección de miembros abstractos cualquier clase o estructura que quiera implementar una interfaz está obligada a implementar cada uno de los métodos que se declaran en la interfaz. De esta forma se consigue un cierto tipo de polimorfismo ya que si varias clases implementan la misma estructura tenemos la posibilidad de tratar con todas ellas de la misma forma.
Seguramente alguien se preguntara por que usar interfaces pudiendo usar una clase base abstracta definiendo los métodos anteriores como abstractos, la primera razón es simplicidad, una clase base abstracta suele hacer más que definir una colección de métodos, es capaz de definir métodos públicos, privados, protegidos y también metodos concretos (estáticos) a los que pueden acceder todas las clases que deriven de ella mientras que una interfaz se limita a definir una colección de métodos sin ninguna implementación. La segunda razón es que C# solamente soporta herencia simple, pero sin embargo podemos hacer que una clase implemente múltiples interfaces.
He aquí como haríamos para heredar de una clase base e implementar una interfaz, teniendo en cuenta que VehiculoDeMotor será nuestra clase base e IMovil nuestra interfaz.
Hay que tener en cuenta que siempre hay que poner la clase base antes de las interfaces.
Ahora nuestra clase CocheDeportivo así como cualquier otra clase que implemente IMovil podra acelerar y frenar, hay que tener en cuenta que si implementamos IMovil tendremos que implementar absolutamente todos sus métodos.

## Obteniendo Referencias a la Interfaz

Si hemos creado la clase CocheDeportivo podemos querer saber si éste soporta el comportamiento de IMovil de modo que podemos hacer un cast explícito:
En caso de que nuestro objeto implemente la interfaz podríamos operar sobre él con todos los métodos de la misma, pero en caso de que no la soporte tendríamos un error en tiempo de ejecución, con lo cual la forma correcta de hacerlo es:
Otra forma de hacerlo sin tener que recurrir a la gestión de excepciones sería utilizando la palabra reservada as de C#:
La palabra reservada as pone la variable de tipo interfaz a null si la interfaz dada no está soportada por el objeto.
Por último también podemos usar la palabra reservada is de C# para descubrir si un objeto implementa o no una interfaz:

## Pasar interfaces como parámetros

Las interfaces son tipos de datos fuertemente tipados (valga la redundancia) de modo que se pueden pasar como parámetros a métodos y se pueden usar también como valores de retorno.
Hemos creado la interfaz IGiro de la siguiente manera:
Y queremos que nuestro coche deportivo pueda girar a izquierda y derecha:
Como hemos visto para soportar otra interfaz simplemente la añadimos al final después de una ",".
Ahora supongamos que queremos hacer un método que nos provea de utilidades para el giro por ejemplo hacer trompos, le podríamos pasar una interfaz IGiro de la siguiente forma

## Implementación Explícita de una Interfaz

Siguiendo con nuestro ejemplo de los coches definimos una nuevas interfaces:
Como se puede ver nuestra interfaz implementa un método Turbo. ¿Qué pasaría si una clase heredase a su vez de la clase Formula Uno que también implemente el método void Turbo (bool)? Bueno vamos a verlo:
Esto en un principio sería correcto pero qué pasa si hacemos lo siguiente:
Ambas veces se llamaría al mismo método, el definido en la clase Formula1, pero como haríamos si quisiéramos tener dos Turbos diferentes? la respuesta es hacer que los métodos definidos en la interfaz sean sólo accesibles desde una referencia a la interfaz, esto es lo que se llama implementación explícita de una interface.
El segundo método sólo podrá ser llamado si usamos una referencia de tipo IAltaVelocidad mientras que el primero podrá ser llamado usando una referencia a Campeon o a Formula1 (su clase base).
Existen algunas reglas extra al hacer esto, por ejemplo no podemos usar modificadores de accesibilidad (public, private, protected) ya que si intentamos que sólo se pueda acceder al método desde una referencia a la interfaz hacerlo sería contraproducente.
También hay que tener en cuenta que pueden haber colisiones de nombres entre clases base e interfaces y entre interfaces entre sí, técnicamente no existe ninguna diferencia y todas pueden ser tratadas como hemos explicado arriba.

## Jerarquías de interfaces

Las interfaces pueden servir de base para otras interfaces al igual que las clases, e igual que en éstas la idea es que vayamos de lo general a lo particular.
Por ejemplo:
Al implementar una de estas interfaces en nuestra clase tenemos que implementar todos los métodos de esta interfaz y de sus ancestros.
Y lógicamente las llamadas a los métodos serían: