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.
class Leer{
private int op;
private OpBinaria obj;
Leer(int op){
this.op = op;
obj = obtObjeto();
}
private OpBinaria obtObjeto(){
if(op == 1){
Suma suma = new Suma();
return suma; //Eclipse dice "NopeNope!" Tu dale OpBinaria :D
}
}
}
abstract class OpBinaria{
public int x, y;
public abstract int op();
}
class Suma extends OpBinaria {
public int op(){
return x + y;
}
}
class Resta extends OpBinaria {
public int op(){
return x - y;
}
}
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
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í:
private OpBinaria obtObjeto(){
if(op == 1){
Suma suma = new Suma();
return (OpBinaria )suma;
}
}
Un saludo.
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
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!