problema de enlace estático? Factory Method JAVA

Iniciado por phr4ckl0t, Septiembre 17, 2017, 03:29:40 PM

Tema anterior - Siguiente tema

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

Septiembre 17, 2017, 03:29:40 PM Ultima modificación: Septiembre 17, 2017, 03:31:48 PM por phr4ckl0t
Hey c0ders saludos una vez mas! paso esta vez con una pequeña duda, leyendo un libro "Java 9 recipes" me topé con un inciso que dice "Creating instaces of a class"  donde muestran brevemente un poco del patrón Factory Method, sucede que tengo una clase Player que es abstracta y de la cual heredan Forward, Goalkeeper y AllPlayer. También tengo la clase Factory que es la encargada de entregarme las instancias que necesito:

Código: java

public class Factory{

    public static Player getPlayer(String role){

        Player player;

        switch(role){
            case "Forward":
                player = new Forward();
                break;
            case "Goalkeeper":
                player = new Goalkeeper();
                break;
            default:
                player = new AllPlayer();
        }
        return player;
    }

}


En la clase main del programa yo creo una instancia de Forward haciendo su respectivo downcast, ya que Factory.getPlayer(), retorna objetos Player.

Código: java

public class Main{
    public static void main(String[] args){

        Forward delantero = (Forward) Factory.getPlayer("Forward");

        delantero.setName("Rolando")
            .setAge("24")
            .setDorsal("11")
            .setTeam("Deportivo tapita")
            .setPosition("DC");

    }
}


El problema viene a la hora de la compilación,  que dice que no encuentra el método setPosition() (clase Main linea 10), como si se tratase de la clase Player, hecho que me resulta muy curioso después de haber realizado el respectivo downcast (clase Main linea 4).

Acá el código de la clase Player y la de Forward

Código: java

public abstract class Player{
   
    private String name;
    private String age;
    private String dorsal;
    private String team;

    public Player(){
        this("", "", "", "");
    }

    public Player(String name, String age, String dorsal, String team){
        this.name = name;
        this.age = age;
        this.dorsal = dorsal;
        this.team = team;
    }

    public String getName(){
        return name;
    }

    public String getAge(){
        return age;
    }

    public String getDorsal(){
        return dorsal;
    }

    public String getTeam(){
        return team;
    }

    public Player setName(String name){
        this.name = name;
        return this;
    }

    public Player setAge(String age){
        this.age = age;
        return this;
    }

    public Player setDorsal(String dorsal){
        this.dorsal = dorsal;
        return this;
    }

    public Player setTeam(String team){
        this.team = team;
        return this;
    }

    @Override
    public String toString(){
        return String.format("Name: %s%nAge: %s%nNumber: %s%nTeam: %s%n",
            getName(), getAge(), getDorsal(), getTeam());
    }
}



Código: java

public class Forward extends Player{

    private String position; //EI, ED, DC
    private int scoredGoals;

    public Forward(){
        this("", "", "", "", "", 0);
    }

    public Forward(String name, String age, String dorsal, String team,
        String position, int scoredGoals){
            super(name, age, dorsal, team);
            this.position = position;
            this.scoredGoals = scoredGoals;
    }

    public String getPosition(){
        return position;
    }

    public int getScoredGoals(){
        return scoredGoals;
    }

    public Forward setPosition(String position){
        this.position = position;
        return this;
    }

    public Forward setSCoredGoals(int scoredGoals){
        this.scoredGoals = scoredGoals;
        return this;
    }

    @Override
    public String toString(){
        return String.format("%sPosition: %s%nScoredGoals: %d%n",
            super.toString(), getPosition(), getScoredGoals());
    }
}


Estaría de lujo un poquito de orientación con respecto a lo que sucede, son las cosas que pasan cuando se estudia solo jeje, muchas gracias de antemano.

El problema esta en la linea 9 del metodo Main. Estas invocando el metodo setTeam que retorna una instancia de la clase Player y luego intentas invocar el metodo setPosition pero en este punto estas trabajando con la instancia Player (ya no la instancia Forward) y como el metodo setPosition no pertenece a la clase Player, entonces ahi Java te arroja el error que no encuentra dicho metodo.

Saludos.
Mi madre me dijo que estoy destinado a ser pobre toda la vida.
Engineering is the art of balancing the benefits and drawbacks of any approach.

Efectivamente Yoya, tienes toda la razón, muchas gracias por tan concisa respuesta, no había caído en cuenta de ese pequeño error. Había llegado hasta a hacer un poco de reflexión de clase para ver que estaba recibiendo después de usar el método getPlayer() y aplicarle el downcast pero como lo que arrojaba estaba en orden me perdí jaja. Ahora ya puedo seguir ;D ;D ;D