Función que retorna objetos de "clases" extendidas de una abstracta

Iniciado por 16BITBoy, 13 Octubre 2010, 20:10 PM

0 Miembros y 1 Visitante están viendo este tema.

16BITBoy

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 (java) [Seleccionar]

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;
    }
}
Blog personal: http://www.16bitboy.com/blog

- Que horrible pesadilla, unos y ceros por todas partes... hasta me parecio ver un ¡dos!
- Bender, solo fue una pesadilla, no existe eso que llamas "dos".

Novlucker

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
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

[D4N93R]

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 (java,4) [Seleccionar]

private OpBinaria obtObjeto(){
        if(op == 1){
            Suma suma = new Suma();
            return (OpBinaria )suma;
        }
    }


Un saludo.

16BITBoy

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
Blog personal: http://www.16bitboy.com/blog

- Que horrible pesadilla, unos y ceros por todas partes... hasta me parecio ver un ¡dos!
- Bender, solo fue una pesadilla, no existe eso que llamas "dos".

[D4N93R]

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!