Pregunta: | 61759 - IDENTIFICAR EL TIPO DE INTERFACE |
Autor: | alex |
wenas, tengo windows xp y uso el programa Jbuilder v2.0, una versión algo ya pasada pero es a lo que estoy acostumbrado. Soy novato en la materia y mi pregunta es la siguiente:
Hace poco que he entendido la utilidad de los interfaces como una forma de acceder a las funciones o métodos de las clases que lo implementan. Me preguntaba si podría ahorrarme de alguna forma el tener que hacer una nueva clase desde la que acceder a todos los objetos que tienen un nuevo interface implementado. Me explico: Por ejemplo, con el interface "Dibujable" hago que todos los objetos que lo implementan en su clase y tengan una función gráfica, sean dibujados en la clase MiCanvas a la que le paso el vector de objetos, y ahí les hago un simple casting (interface) dentro del bucle que recorre todo el vector de objetos. ok, hasta aqui es fenomenal y esta misma dinámica la empleo para el teclado, el ratón y los hilos (threads). Pero me preguntaba si cada vez que quiero añadir un nuevo tipo de comportamiento a los objetos, por ejemplo una acción (un thread), tengo que crear obligatoriamente un nueva case thread asociada al nuevo interface. Pues es que veo que la única diferencia entre los múltiples threads está en la mención al interface a la hora de hacer el casting. Y creo que sería mejor hacer un sólo thread más general que pueda identificar el tipo de interface. gracias por la atención, un saludo. |
Respuesta: | alex |
weno, pues al final me constesto yo mismo ... ^^¡
... en el caso de un hilo (un Thread), se puede crear éste en un método (una función) en la clase del mismo objeto; este método debe contener un objeto de la clase Runnable, que es un interface, o de otra clase interface que extienda de Runnable ... así: void miMetodo(){ Runnable miRunable = new Runnable(){ public void run(){ try{ Thread.sleep(50); }catch(Exception e){} } //fin de run }; //fin de Runnable } //fin de miMetodo Thread hilo = new Thread(miRunable); hilo.start(); Y ya está, así se pueden hacer múltiples métodos con diferentes comportamientos de un mismo objeto sin tener que crear otra nueva clase (en este caso de los Threads). En el caso de otros comportamientos que no sean hilos, supongo que se puede proceder análogamente con los interfaces. En el ejemplo anterior, suele ser necesario poder detener el hilo añadiendo un método llamado algo así como "setTerminar(boolean terminar){}" al que se le pasa true o false para acabar. Pero como el interface Runnable sólo declara el método run() no se puede utilizar el otro método para acabar, entonces es mejor crear otro interface que extienda de Runnable y declare el método "setTerminar()" ... ... de esa forma el ejemplo anterior queda así: supongamos que hemos creado la clase interface "intf_Runnable" que extiende de Runnable y declara el método "setTerminar": void miMetodo(){ intf_Runnable miRunable = new intf_Runnable(){ private boolean terminar=false; public void setTerminar(boolean terminar){ terminar = terminar; } public void run(){ while(!terminar){ try{ Thread.sleep(50); }catch(Exception e){} } } //fin de run }; //fin de Runnable } //fin de miMetodo Ahora ya se puede detener el hilo con el mismo boton por ejemplo: int n; if(button.getLabel().equals("Arrancar")) n=1; if(button.getLabel().equals("Detener")) n=2; switch(n){ case 1: hilo= new Thread (miRunnable); hilo.start(); button.setLabel("Detener"); break; case 2: miRunnable.setTerminar(true); hilo.stop(); hilo= null; button.setLabel("Arrancar"); break; default: } Nota: el objeto hilo hay que declararlo fuera del método, en los atributos de la clase. Después ya se define dentro de case 1 del switch como se ve. ... espero que le sirva a alguien ... un saludo. |