Concepto de Interfaz

walterchere
04 de Diciembre del 2003
Quisiera entender el concepto de interfaces, ya sea teóricamente como en un ejemplo.

YoPasabaPorAqu?.
04 de Diciembre del 2003
Una interfaz en java es una Clase en la que no se han definido ninguno de sus métodos. Solo se han "enunciado". Un ejemplo sería:

interface NuevaInterface{
public void metodo1();
public void metodo2();
}
Las interfaces se implementan en otras clases. Esto es, el código de cada método se ha de escribir en los métodos de la clase que implementa al interface. Para que una clase implemente a un interfaz, tiene que sobreescribir TODOS los métodos del interfaz. Puede, eso sí tener métodos propios:

class OtraClase implements NuevaInterface{
public void metodo1(){
//Código del método...
}
public void metodo2(){
//Código del método...
}
public void metodoPropio1(){
//Código del método...
}
//...
}

Las interfaces son útiles para simular la herencia múltiple, que no está permitida en Java. Una clase puede heredar métodos de otra (llamada clase padre), pero no de varias. Sin embargo, una clase puede implementar a varias interfaces:

class nuevaClase implements interfaz1, interfaz2, ...{
//...
}

Una clase normal puede heredar de una interfaz, adquiriéndo todos los métodos y constantes de dicha interfaz...

class otroEjemplo extends unInterface{
//...
}

Todo esto de la herencia usando interfaces tiene bastantes utilidades, sobre todo para ahorrar trabajo. Imagina que quieres hacer una aplicación a base de ventanas. Cada ventana la programas como un tipo de objeto distinto de las otras, escribiendo una clase para cada ventanaImagina que quieres que todas tengan seis botones en la parte superior. Bastaría crearte un interfaz que tuviese como atributos esos seis botones. Todas las clases que hereden de ella o la implementen, tendrán automáticamente esos seis botones. También podrías hacer que algunas de las ventanas -no todas- tuviesen en común otros rasgos: bastaría con crearte otro interfaz que definiese dichos rasgos comunes. Las ventanas que quisieran tenerlos, implementarian - ya no vale heredar, pues una clase solo puede heredar de otra, no de varias - al primer interfaz de los seis botones y a este último.

Ah!, Supongo que te referías a este significado de Interfaz. Hay veces que se referen al interfaz de una aplicación como "lo que se puede ver de esa aplicación" -o mejor- "lo que la aplicación presenta al mundo exterior". Me explico. Un programa gráfico presenta una ventana con botones al usuario, y es a través de esta como el usuario interacciona con dicho programa. Además, el mismo programa puede ser compatible con otros programas, pudiéndo ser manejado desde otra aplicación. Nuestro programa presenta una Interfaz distinta al otro programa (supón un conjunto limitado de métodos o instrucciones que se pueden ejecutar desde fuera). Otro ejemplo. Suponte un váter. Tú serías el usuario, y la tapa, sería la interfaz desde la que te manejas con el resto del váter. Un váter puede presentar varias interfaces (basta con bajar la tapa o subirla) para un mismo usuario.

Espero haberte aclarado el concepto de Interfaz.

Miguelin
04 de Diciembre del 2003
Hola,

Aprovecho el hilo para plantear una duda sobre el tema, ya que a mí no me queda clara la utilidad de las interfaces.

Puesto que los métodos de las interfaces no presentan implementación por qué no se declaran directamente los métodos de la interfaz en la clase ya que de todas formas va a haber que hacerlo. En otras palabras, me parece inútil el declarar una interfaz y escribir las declaraciones de los métodos de la interfaz cuando directamente podrías escribir esos métodos en la clase.

Un saludo.

YoPasabaPorAqu?.
04 de Diciembre del 2003
Hola.

Generalmente, antes de codificar una clase, método, o incluso un programa entero, tenemos que pasar antes por una etapa -mas grande o pequeña- en la que planifiquemos lo que vamos a hacer. Es ahí cuando estamos diseñando: planificamos y estructuramos nuestro posterior trabajo. Con esto, conseguimos ahorrarnos esfuerzo y quizás algunos errores que, de otro modo, podríamos acabar cometiendo. Nos servimos de diagramas de clases, de estado, y otros gráficos que representan la interacción de los componentes de nuestra aplicación, los objetos que queremos crear, con sus acciones y atributos,

Bien. En una clase normal, podemos apreciar parte de esa estructura que ha surgido del diseño anterior. Basta con ver los métodos, y los atributos. Esto también ocurre en una Interfaz. Sin embargo, aunque en una clase normal si se ha implementado el código en la interfaz no.

Las interfaces se suelen crear más bien en vistas al diseño que a la funcionalidad de la aplicación. En el ejemplo que puse de aplicación gráfica (las ventanas de los 6 botones), se puede prescindir perfectamente de la interfaz, el programa seguiría siendo perfectamente válido. Sin embargo, fíjate. De no usar la interfaz con los 6 botones como atributos, habría que incluir en cada clase-ventana de la aplicación 6 botones. Si encima quisiésemos usar las caracteristicas de herencia múltiple (no permitida en JAVA), y hacer una ventana que tuviese características comunes a más de una ventana, tendríamos que definir en la clase que definiese esa ventana todos los atributos que ya teníamos definido de antes.
En cuanto a los métodos de una interfaz... Vale, hay que definirlos e implementarlos de nuevo en otra clase. Desde el punto de vista práctico no vale de mucho hacerlo -además, supone más trabajo- pero sirve para organizarte más las cosas en un proyecto. Suponte este ejemplo: tenemos dos interfaces -Hervivoro, Carnivoro y Mamifero-, con un método cada una -pastar, cazar y mamar, respectivamente-. Podríamos definir la clase Caballo, haciéndola que implemente a los interfaces Hervivoro y Mamifero. También podríamos tener la clase Leon, que implementa a Mamifero y a Carnivoro, y así más animales. Si usamos los interfaces podemos hacernos un esquema mental -o sobre el papel- de todos los animales. Es todo mucho más claro.
Las interfaces proporcionan una forma de organización entre clases. Esto, aunque puede ser prescindible para hacer un programa que funcione, es conveniente. Podemos perfectamente hacer aplicaciones largas en una sola clase, o incluso en el main, pero si prescindimos del modelado orientado a objetos, el código puede complicarse o quizás el desbarajuste sea tal que, después de una semana, ni el programador sea capaz de seguir el hilo de lo que hizo.

Un saludo.

Miguelin
04 de Diciembre del 2003
Hola,

Estoy de acuerdo en que todo lo que sea "perder" tiempo en organizar mejor el código y hacerlo más legible a la larga reporta muchos beneficios.
Gracias por tus explicaciones.

Un saludo.

bob
04 de Diciembre del 2003
la definicion de interfaz, puerto y direccionamniento