Foro de elhacker.net

Programación => Java => Mensaje iniciado por: 16BITBoy en 13 Octubre 2010, 20:10 pm



Título: Función que retorna objetos de "clases" extendidas de una abstracta
Publicado por: 16BITBoy en 13 Octubre 2010, 20:10 pm
Hola amigos.

He estado haciendo uno de los ejercicios que mi profesor me ha mandado y resulta que al plantearme la lógica para resolver el problema, a mi me resulta lógico (no en todos los casos, pero en este si) hacer que una función según un valor que se le pasa o que lo tiene su clase, retorne un objeto de una clase distinta según ese valor. Eso java no lo permite ( y creo que muchos otros tampoco...) No se me ocurre por ahora una manera mas intuitiva para mi(o mejor dicho, personal, a mi estilo, que eso de intuitivo es algo que depende de cada uno :D) de resolver el problema que tengo, el cual si queréis expongo, pero por ahora os pongo el código de prueba, aislado, que muestra exactamente lo que intento.

A ver si se os ocurre algo en esta forma de pensar, que me ayude a solucionar el problema. Según un valor tengo que asignar en una referencia a objeto de clase abstracta un objeto de una clase extendida de esa misma abstracta, pero esta devuelta desde una función.

Código
  1. class Leer{
  2.    private int op;
  3.    private OpBinaria obj;
  4.    Leer(int op){
  5.        this.op = op;
  6.        obj = obtObjeto();
  7.    }
  8.    private OpBinaria obtObjeto(){
  9.        if(op == 1){
  10.            Suma suma = new Suma();
  11.            return suma; //Eclipse dice "NopeNope!" Tu dale OpBinaria :D
  12.        }
  13.    }
  14. }
  15.  
  16. abstract class OpBinaria{
  17.    public int x, y;
  18.    public abstract int op();
  19. }
  20.  
  21. class Suma extends OpBinaria {
  22.    public int op(){
  23.        return x + y;
  24.    }
  25. }
  26.  
  27. class Resta extends OpBinaria {
  28.    public int op(){
  29.        return x - y;
  30.    }
  31. }
  32.  


Título: Re: Función que retorna objetos de "clases" extendidas de una abstracta
Publicado por: Novlucker en 13 Octubre 2010, 20:24 pm
Cada vez que me paso por este foro aclaro lo mismo, no se programar en Java, así que si digo una burrada avisen :xD

Ahí estas devolviendo una instancia de clase de tipo suma, y dado que necesitas devolver una de tipo opBinaria, alcanzaría con que castees :D

Saludos


Título: Re: Función que retorna objetos de "clases" extendidas de una abstracta
Publicado por: [D4N93R] en 13 Octubre 2010, 20:42 pm
Como dice Nov, aunque no es un cast como tal, el termino correcto es Boxing, el cual consiste en "empacar" la referencia en una de sus clases bases, o simplemente en object.

Sería algo así:
Código
  1. private OpBinaria obtObjeto(){
  2.        if(op == 1){
  3.            Suma suma = new Suma();
  4.            return (OpBinaria )suma;
  5.        }
  6.    }
  7.  

Un saludo.


Título: Re: Función que retorna objetos de "clases" extendidas de una abstracta
Publicado por: 16BITBoy en 13 Octubre 2010, 20:58 pm
Gracias!. Hay que ver que vengo del C y no ocurrirseme un casting, ("boxing" aquí, buen apunte :) )
Me tragué que no funcionaba también al probarlo por que ahí solo estaba evaluando una de las opciones, osea si op != 1 eso no retorna nada :D Y claro aun con el box/cast pues eclipse me dice que para mi padre si estaría bien :D


Título: Re: Función que retorna objetos de "clases" extendidas de una abstracta
Publicado por: [D4N93R] en 14 Octubre 2010, 01:39 am
Si, y también se puede hacer lo contrario, es decir, unboxing, que lo que haría en tu caso es sacar la clase Suma de OpBinaria: return (Suma)obj; obviamente siempre tienes que validar si esa referencia contiene boxeado un objeto Suma.

Saludos!