3.2 INSTANCE OF

 

Seguimos con el post anterior, tenemos que tener claro que las interfaces no se pueden instanciar, siguiendo con el ejemplo de Uso_empleado la clase Jefatura podía heredar de la clase Empleado y gracias al principio de sustitución podíamos hacer esto:

Empleado director_comercial = new Jefatura(“Sara”, 75000, 2011, 05, 03);

La clase Empleado implementaba la interfaz comparable pero no podemos hacer esto:

Comparable ejemplo = new Comparable();

Ya que no se pueden instancias, pero gracias al principio de sustitución sí que podemos hacer esto:

Comparable ejemplo = new Empleado(“Antonio”, 35000, 2003, 03, 05);

Para saber si una interface pertenece a una clase o una clase pertenece a una interfaz entra en juego un nuevo concepto: instance of.

InstanceOf se usa para saber si una interface pertenece a una clase o una clase pertenece a una interfaz. Seguimos con el ejemplo Uso_empleado, podemos hacer esto antes de los bucles for utilizando el principio de sustitución:

Empleado director_comercial=new Jefatura("Sonia", 85000, 2010, 05, 02);

Y como la clase Empleado implementa una interfaz también podemos hacer esto:

Comparable ejemplo=new Empleado("Elena", 15000, 2011, 03, 02);

Después de esto imaginaros que es una aplicación compleja en el que tenemos muchas clases que heredan, interfaces… y nos vemos en la necesidad de saber si es una clase o una interfaz para ello utilizamos instanceof de la siguiente manera:

if(director_comercial instanceof Empleado) {

                   

                    System.out.println("Es de tipo Jefatura");

             }

            

             if(ejemplo instanceof Comparable) {

                   

                    System.out.println("Implementa la interfaz comparable");

             }

Si ejecutamos la aplicación:

Nos indica que director_comercial es de tipo Jefatura aunque está metida en una clase Empleado ya que Jefatura, un jefe es un empleado. Y ejemplo es una interfaz de Comparable.

Vamos a borrar estas últimas líneas que hemos programado y vamos a ver cómo crear nuestras propias interfaces. Vamos a crear una primera interfaz a la que vamos a llamar Jefes, esta interfaz va a tener un método al que vamos a llamar tomar_decisiones, si en un futuro algún programador quiere implementar esta interfaz está obligado a reescribir este método.

Empezamos con la práctica, creamos la interfaz del siguiente modo:



A continuación, le damos un nombre:



Y se nos crea una interfaz llamada Jefes:

package poo;

 

public interface Jefes {

 

}

Y aquí es donde vamos a crear nuestro método:

package poo;

 

public interface Jefes {

     

      String tomar_decisiones(String decision);

 

}

Una vez creado el método tenemos que ir a la clase Jefatura e implementar esta interfaz:

class Jefatura extends Empleado implements Jefes {

Tenemos que crear el método:

public String tomar_decisiones(String decision) {

        

         return "Un miembro de la dirección ha tomado la siguiente decisión: "+decision;

   }

Vamos a la función principal para llamar a este método:

System.out.println(jefa_finanzas.tomar_decisiones("Subir el sueldo a los empleados"));

Si ejecutamos la aplicación:



Vamos a crear otra interfaz llamada Trabajadores en la que creamos un método establece_bonus(), supongamos que en la empresa cuando llega Navidad a todos los empleados les dan un bono. Pues vamos a ello, creamos la interfaz Trabajadores:

package poo;

 

public interface Trabajadores {

 

}

Y vamos a crear en ella un método y una variable:

package poo;

 

public interface Trabajadores {

     

      double establece_bonus(double gratificacion);

   

    double bonus_base=1500;

 

}

Una vez hecho esto vamos a ir a la interfaz Jefes que va heredar de Trabajadores con lo que se crea una jerarquía entre las interfaces:

package poo;

 

public interface Jefes extends Trabajadores{

     

      String tomar_decisiones(String decision);

 

}

En el momento que se ha hecho esto nos ha dado error en el archivo Uso_empleados. Esto quiere decir que en la clase Jefatura en el momento de que la interfaz Jefes hereda de Trabajadores también tiene que implementar el método establece_bonus, por lo que creamos el método tomar_decisiones en la clase Jefatura:

       public double establece_bonus(double gratificacion) {

        

         double prima=2000;

       

         return Trabajadores.bonus_base+gratificacion+prima;

   }

A los jefes vamos a devolverle el mínimo del bonus_base que eran 1500, la gratificación que lo pondremos en la función main y la prima que son 2000 que declaramos en el mismo método.

La interfaz Trabajadores la implementamos en la clase Empleado:

class Empleado implements ComparableTrabajadores {

Y creamos el método establece_bonus:

public double establece_bonus(double gratificacion) {

   

    return Trabajadores.bonus_base+gratificacion;

}

Ahora llamamos a estos métodos desde la función principal main:

System.out.println("El Jefe "+jefa_finanzas.dameNombre()+" tienen un bonus de: "+jefa_finanzas.establece_bonus(500));

            

             System.out.println(misEmpleados[3].dameNombre()+" tiene un bonus de: "+misEmpleados[3].establece_bonus(200));

Si ejecutamos la aplicación:



Para ver todo lo aprendido hasta ahora nos vamos a crear una aplicación que va a consistir en un Temporizador que nos informe cada x segundos la hora. Para crear este temporizador vamos a tener que recurrir a la clase Timer, que pertenece al paquete javax.swing por lo que habrá que importar este paquete en nuestro ejemplo, esta clase también implementa una interface.

El constructor de la clase Timer tiene dos parámetros el primer parámetro es un valor de tipo entero que será la frecuencia que queremos que el temporizador ejecute la acción y el segundo parámetro es de tipo interfaz (ActionListener).

Para verlo más claro nos creamos el ejemplo al que vamos a llamar PruebaTemporizador.java con el método main:

package poo;

 

public class PruebaTemporizador {

 

      public static void main(String[] args) {

 

      }

 

}

Como vamos a utilizar la clase Timer hay que importar el paquete javax.swing:

import javax.swing.*;

Dentro del método main creamos la clase Timer, el nombre del objeto le vamos a llamar MiTemporizador:

      public static void main(String[] args) {

           

            Timer MiTemporizador = new Timer();

 

      }

En el constructor como ya se ha comentado hay que pasarle dos parámetros, el primero es de tipo entero que es la frecuencia que queremos que ejecute la acción, queremos cada 5 segundos muestre la hora en consola. El segundo parámetro es de tipo interface ActionListener, esta interfaz pertenece al paquete java.awt.event por lo que también tendremos que importar este paquete.

Además tenemos que tener en cuenta que cuando implementamos una interfaz en una clase estamos obligados a desarrollar los métodos que tiene esa interfaz. ActionListener solo dispone de un solo método, el método actionPerformed es de tipo void que no devuelve nada, este método es llamado cuando recibe una acción. De momento este segundo parámetro lo vamos a llamar oyente, luego ya veremos como lo solucionamos para que no marque el error.

Timer MiTemporizador = new Timer(5000, oyente);

Vamos a crear una clase después del método main que va a implementar esta interfaz ActionListener:

class DameLaHora implements ActionListener {

     

     

}

Creamos el método que viene con la interfaz:

class DameLaHora implements ActionListener {

 

      @Override

      public void actionPerformed(ActionEvent e) {

            // TODO Auto-generated method stub

           

      }

     

}

Ahora le tenemos que indicar lo que hace este método, lo que queremos es que salga en consola la hora cada cinco segundos, para ello hemos de utilizar la clase Date creamos un objeto perteneciente a la clase Date

class DameLaHora implements ActionListener {

 

      @Override

      public void actionPerformed(ActionEvent e) {

           

            Date ahora = new Date();

           

      }

     

}

Lo que hace es almacenar en la variable ahora la hora actual, luego creamos un System.out con lo que queremos que nos muestre en consola:

class DameLaHora implements ActionListener {

 

      @Override

      public void actionPerformed(ActionEvent e) {

           

            Date ahora = new Date();

            System.out.println("La hora cada 5 segundos: "+ahora);

      }

     

}

Nos queda por crear la instancia del segundo parámetro que le pasamos a la clase Timer, justo encima de la instancia Timer creamos lo siguiente:

      public static void main(String[] args) {

           

            DameLaHora oyente = new DameLaHora();

           

            Timer MiTemporizador = new Timer(5000, oyente);

 

      }

Para finalizar lo que tenemos que indicar es que empiece a ejecutar el temporizador, el objeto MiTemporizador, eso lo hacemos con el método start, luego con una ventana de JOptionPane comprobamos que inicia el temporizador:

      public static void main(String[] args) {

           

            DameLaHora oyente = new DameLaHora();

           

            Timer MiTemporizador = new Timer(5000, oyente);

           

            MiTemporizador.start();

           

            JOptionPane.showMessageDialog(null, "Pulsa Aceptar para detener");

           

            System.exit(0);

 

      }

En el momento que pulsemos el botón Aceptar de la ventana JOptionPane la aplicación se detendrá, esto es gracias a System.exit(0).




3.1 INTERFACES << >> 3.3 CLASES INTERNAS



No hay comentarios:

Publicar un comentario