jueves, 7 de diciembre de 2017

Interfaces

Un interfaz es una lista de acciones que puede llevar a cabo un determinado objeto. Sorpresa, ¿eso no eran los métodos que se definen en una clase? Casi, en una clase además de aparecer los métodos aparecía el código para dichos métodos, en cambio en un interfaz sólo existe el prototipo de una función, no su código.
Veamoslo con un ejemplo: Pensemos en un interfaz que en su lista de métodos aparezcan los métodos despegar, aterrizar, servirComida y volar. Todos pensamos en un avión, ¿verdad? El motivo es sencillamente que avión es el concepto que engloba las acciones que hemos detallado antes, a pesar que existan muchos objetos avión diferentes entre sí, por ejemplo Boeing 747, Boeing 737, MacDonell-Douglas.
Lo realmente interesante es que todos ellos, a pesar de pertenecer a clases distintas, poseen el interfaz avión, es decir poseen los métodos detallados en la lista del interfaz avión.
Esto significa también que a cualquier avión le podemos pedir que vuele, sin importarnos a que clase real pertenezca el avión, evidentemente cada clase especificará como volará el avión (porque proporciona el código de la función volar).
En java un interfaz define la lista de métodos, pero para que una clase posea un interfaz hay que indicar explícitamente que lo implementa mediante la claúsula implements. Pero veamos primero la estructura de un interfaz:
          [modif.visibilidad] interface nombreInterfaz [extends listaInterfaces]
         {
          prototipo método1;
          
..
          prototipo método1;
         }
         
Donde modif.visibilidad puede ser public o bien sin especificar, es decir visibilidad pública (desde cualquier clase se puede emplear el interfaz) o de paquete (sólo se puede emplear desde clases del mismo paquete).
nombreInterfaz por convenio sigue las mismas reglas de nomenclatura que las clases, y en muchos casos acaba en able (que podíamos traducir como: ser capaz de).
La claúsula opcional extends se emplea para conseguir que un interfaz hereda las funciones de otro/s interfaces, simplemente listaInterfaces es una lista separaada por coma de interfaces de los que se desea heredar.
En muchas ocasiones un interfaz es empleado para definir un comportamiento, que posteriormente será implementado por diversas clases, que podrían no tener nada que ver entre ellas, pero que todas se comportarán igual de cara al interfaz. Es decir, todas tendrán las funciones indicadas por el interfaz.
Cuando varios objetos de distintas clases pueden responder al mismo mensaje (función), aún realizando cosas distintas se denomina polimorfismo.
Prácticas:
Vamos a definir el interfaz Cantante, un interfaz muy simple que sólo posee un método: cantar.

  • Crear el fichero Cantante.java
  • Agregar el siguiente código:
            public interface Cantante
            {
             public void cantar();
            }
            
  • Cojamos la clase Persona y hagamos que implemente el interfaz Cantante:
            public class Persona implements Cantante
            
  • Además agreguemos el código para el método que define el interfaz cantante:
            public void cantar()
            {
                  System.out.println("La laa la raa laaa!");
            }
            
  • Construyamos ahora una clase con función main (ArranqueInterfaz.java)para ejecutar:
            public class ArranqueInterfaz
            {
             public static void main(String arg[])
             {
              
              Persona p = new Persona();
              hacerCantar(p);
             }
             public static void hacerCantar(Cantante c)
             {
              c.cantar();
             }
            }
            
  • Podemos ver que construimos un objeto (p) de tipo persona y se lo pasamos a la función hacerCantar. Esta función espera recibir un objeto Cantante, y una persona lo es, por tanto la recibe y llama al método cantar del objeto recibido.
  • Probemos a intentar pasar a la función hacerCantar en lugar del objeto Persona (p) un objeto String (texto), resultado: error de compilación.
  • Contruyamos ahora la clase Canario (Canario.java), pensando que también sabe cantar:
            public class Canario implements Cantante
            {
             private int peso;
             /* Aqui vendrían el resto de atributos y funciones propias de un canario */
             

             public void cantar()
             {
              System.out.println("Pio Pio Pio");
             }
            }
            
  • Y ahora agreguemos en la clase ArranqueInterfaz el siguiente código, para crear un objeto canario y pasarselo a la función hacerCantar:
            Canario c = new Canario();
            hacerCantar(c);
            
  • Tras ejecutar comprobaremos que podemos pasar tanto una Persona como un Canario a la función hacerCantar, de tal manera que dentro de dicha función sólo accedamos a las funciones del interfaz y no habrá problemas. Por ejemplo, si pusieramos:
            c.SetNombre("Luis")
            
  • dentro de la función hacerPersona, podría funcionar si pasasemos un objeto Persona, pero no si pasamos uno de tipo Canario.

No hay comentarios:

Publicar un comentario

Interfaces

Un interfaz es una lista de acciones que puede llevar a cabo un determinado objeto. Sorpresa, ¿eso no eran los métodos que se definen en un...