sábado, 10 de diciembre de 2011

Interfaces

votar
   Cuando se comienza a estudiar Java, se aprenden normalmente primero los conceptos de Clase, Objeto, Métodos, Tipos, Variables, etc. Y de repente un día comienzan a hablarte de interfaces. ¿Interfaces?, pero, ¿qué es eso?, se pregunta el novato nervioso. ¿Es una clase?, ¿es un método?, ¿cómo se usa?, ¿es lo mismo que la interfaz de usuario? (vale, este último no estuvo muy atento en ninguna de las clases). Tranquilos todos, que aquí os vamos a explicar las interfaces como si fueseis niños.

   Una interfaz en Java, en realidad no es más que un cajón donde guardar uno o varios métodos de forma que todas las clases que lo necesiten puedan cogerlos y emplearlos. La cuestión es que esos métodos de las interfaces no tienen cuerpo, están vacíos; vamos, que no son más que el nombre, como si fuesen el método de una clase abstracta, así que cuando una clase va a utilizarlos tiene que implementarlos o desarrollarlos.

   Y por qué, te preguntarás, no puede una clase escribir directamente sus propios métodos, sin necesidad de implementar los de una interfaz. Bueno, aquí es donde viene el ejemplo explicativo.

   Supongamos que tienes una clase llamada Vehículos que tiene varias subclases: Coche, Moto, Camión, Autobús y Bicicleta. Esta clase Vehículos tiene una serie de métodos que por supuesto todas sus subclases heredan, como arrancar( ), frenar( ) o velocidad( ). Pero resulta que Coche, Camión y Autobús necesitan un método extra abrirPuertas( ). ¿Dónde lo pondrías?. Si lo colocas en Vehículos lo heredarían también Moto y Bicicleta, que no tienen ninguna puerta que abrir. Si estuviésemos en otro lenguaje, como C++ que permite la multiherencia podríamos hacer que las clases con puerta fuesen además de subclases de Vehículos, subclases de otra clase distinta con el método abrirPuertas( ), pero esto es Java. Claro, podemos escribir tres métodos distintos para cada una de las clases que lo necesiten, pero hay una forma mucho más económica de hacerlo: ir al cajón-interfaz que tenga este método y cogerlo.

   Así, no sólo estas clases pueden utilizar este método y adaptarlo a sus necesidades, sino que en realidad, cualquier otra clase no relacionada con ellas puede hacerlo también. Por ejemplo, si tenemos la clase Vivienda, también ella y todas sus subclases pueden utilizar el método abrirPuertas( ) sin tener ninguna relación con Vehículos ni sus subclases.

   La palabra mágica a utilizar es implements:
      class Coche extends Vehículos implements Abrible //Abrible es el nombre de la interfaz

   Una clase sólo puede extender otra (es una familia monoparental) pero puede implementar todas las interfaces que necesite. Es más, una interfaz también puede extender (que no implementar) otras interfaces. Esto es útil sobre todo cuando tú ya has escrito una interfaz y más adelante quieres añadirle otro método. Si lo haces en la vieja interfaz, todos los programas que estén usándola dejarán de funcionar porque ellos no implementan ese nuevo método. Así que puedes crear una nueva interfaz que extienda la antigua y que utilicen sólo los que necesiten ese nuevo método.

  ¿Cómo se escribe una interfaz?. Es muy similar a una clase:
   public interface Interface extends Interface2, Interface3{
             void abrirPuertas( );
   }

   Por supuesto, extends sólo se usa si la interfaz extiende alguna otra. El modificador public es para que cualquier clase pueda utilizar la interfaz. Si omites este modificador sólo las clases dentro del mismo paquete de la interfaz podrán utilizarla.
   Todos los métodos de una interfaz son implícitamente públicos y abstractos, así que no hay necesidad de añadirles esos modificadores.
   Las interfaces, además de métodos pueden tener constantes, que son siempre públicas, estáticas y finales, por lo que tampoco hay que añadirles esos modificadores. Por ejemplo:
      double Pi = 3.14;

   Cuando una clase implementa una interfaz, debe implementar todos los métodos de esa interfaz, y seguir todas las reglas de sobrescritura (override) de esos métodos.

   Además, una interfaz puede ser usada como un tipo de referencia en cualquier clase que la implemente, igual que si fuese un tipo primitivo o un objeto:
      Abrible ob1 = (Abrible)ob1;
   De esta forma, ob1 puede utilizar el método abrirPuertas( ) y es considerado no sólo como tipo de su clase, sino también como tipo de la interfaz.

   Si a pesar de la sencillez que hemos intentado usar en la explicación tienes alguna dificultad en seguirla, mándanos un mensaje o entra en la web JavaParaNulos donde encontrarás un Tutorial para principiantes.
   

4 comentarios:

  1. Una duda,
    ¿entonces viendo el ejemplo
    public interface Interface extends Interface2, Interface3{...}
    quiere decir que las interfaces sí pueden extender de más de una interfaz??

    ResponderEliminar
    Respuestas
    1. Hola, Púa.
      Efectivamente, las interfaces pueden extender más de una interfaz, al igual que una clase puede implementar más de una interfaz.
      Gracias por leer el blog. ¡Un saludo!

      Eliminar
  2. Gracias y enhora buena por el blog!

    ResponderEliminar