Cuando se implementa una interface se está aceptando una especie de contrato definido en la interface. Esto significa que estás aceptando el proveer implementaciones legales para cada método definido en la interface.
Por ejemplo, si se crea una clase que implemente la interface
Runnable (para que el código pueda ser ejecutado por un
hilo específico), debes de proveer el método
public void run(). De otra manera, el hilo podría querer ser ejecutado pero al momento de buscar el método que le indique qué hacer simplemente no lo encontrará por que no fue definido. Java previene este tipo de situaciones ejecutando un chequeo por medio del compilador que verifíca que cada clase que implemente una interface provea de igual manera la implementación de cada uno de los métodos contenidos dentro de esta interface.
Asumiendo la interface Rebotable, que contiene dos métodos: rebotar() y setFactorRebote(), el siguiente código de clase compilaría sin problemas:
public class Pelota implements Rebotable{ public void rebotar(){} public void setFactorRebote(int fr){}}Analizando el código anterior nos damos cuenta de que la implementación se efectúa, aunque los métodos simplemente no hagan nada, con esto concluimos que la implementación de una interface garantiza la implementación de los métodos definidos dentro de ella, pero no una 'buena' implementación, o incluso que los métodos contengan alguna cantidad de código definido dentro de los mismos.
Las clases implementantes deben de seguir las mismas reglas de implementación de los métodos de una interface así como las clases que heredan a otra clase abstracta. Para realizar una implementación legal una clase no abstracta debe de obedecer a las siguientes reglas:
- Proveer implementación concreta (no abstracta) para todos los métodos declarados en una interface.
- Seguir las reglas de la sobreescritura de métodos.
- Declarar excepciones no verificadas en la implementación de los métodos distintos de aquellos declarados por los métodos de la interface, o subclases de aquellos declarados en los métodos de la interface.
- Mantener la firma de los métodos de la interface, y mantener el mismo tipo de retorno (o un subtipo del tipo de retorno).
Se debe de tomar en cuenta que una clase implementante puede a su vez ser
abstracta, por ejemplo:
abstract class Pelota implements Rebotable { }Si este fuera el caso, la clase simplemente pasa la responsabilidad de la implementación de los métodos de la interface a la primera siguiente clase no abstracta. Por ejemplo, si PelotaDePlaya es una clase no abstracta pero hereda de la clase Pelota, entonces PelotaDePlaya tiene que implementar los métodos de la interface Rebotable...
class PelotaDePlaya extends Pelota{public void rebotar(){ //métodos que especifican el comportamiento al rebotar //de una pelota de playa}public void setFactorRebote(int bf){ //métodos que especifican el factor de rebote //de una pelota de playa}//Si la clase Pelota define uno o varios métodos abstractos//deben de ser implementados por la clase PelotaDePlaya de//igual manera que aquellos de la interface Rebotable.}Antes de finalizar, debemos de mencionar algunos aspectos importantes de las interfaces:
1. Una clase puede implementar más de una interface, es perfectamente legal realizar algo como lo siguiente:
public class Pelota implements Rebotable, Serializable, Runnable {
.
.
.
}
Se puede extender o heredar solamente una clase pero implementar varias interaces.
2. Una interface puede extender o heredar a una o más interfaces, pero nunca puede implementar nada.
public interface Rebotable extends Movible, Serializable {} //ok!
La clase que implemente a Rebotable debe de proveer los métodos tanto para rebotable como Movible y Serializable.
Hasta aquí le dejamos con las interfaces en Java.
Algo que decir o alguna duda? Deja tu comentario. Saludox.
Muchas gracias por el minituto... mi hacido de muchisima ayuda, ya que apenas empiezo en este mundo POO y Java...
ResponderBorrarSalu2
Clark