Duvida sobre polimorfismo

4 respostas
nekiess
.:N:. ________ Estou aq treinando o padrão Strategy (ou tentando fazer algo hehe) nem sei se esta correto da forma que fiz mas deixa quieto. Deem uma olhada se esta mais ou menos como deveria ser o padrão Strategy. Mas minha duvida não é esta... o padrão é o de menos. Mas para quem entende de padrões gostaria de saber se o padrão esta nos conformes ou se esta muito errado? hehe. . vamos a duvida principal :arrow: POLIMORFISMO . observem que na interface CargoAdministrativo criei um metodo exatamente nele, que era para eu testar um troço aq... criei o metodo testaAdm que deverá ser implementado pelas duas classes abaixo dele. [img]http://multiply.com/mu/nekiess/image/1/photos/50/600x600/1/her.JPG?et=UYdeTdwqt0uokXVAd3u9%2CA&nmid=379319772[/img] . O ponto é que eu não consigo usar este metodo quando crio um objeto na classe TestaFuncionario... sei que os metodos que eu implementar na interface Cargo deverei usar nas classes abaixo e poderei sobrepor para melhor adequar ao que quero... só que não estou conseguindo usar um metodo que crio em classes abaixo da interface Cargo. . Inicialmente eu tinha criado a classe CargoAdministrativo como abstrata mas mesmo assim não consigo... Vejam como fica com a classe CargoAdministrativo sendo abstrata e implementando a interface Cargo. . [img]http://multiply.com/mu/nekiess/image/1/photos/51/600x600/1/her2.JPG?et=Uq9OxD8T7k%2CuN5G9QKMnRQ&nmid=379323440[/img] . . Aqui esta o código que uso no testa funcionario para criar um objeto do tipo especialista e mudando de forma dinamica para um funcionario do tipo bibliotecario utilizando o primeiro exemplo apontado acima, logo em seguida tento rodar o metodo testaAdm().
import java.util.ArrayList;

import javax.swing.JOptionPane;


public class TestaFuncionario {
    public static void main(String[] args)
    {
        Funcionario2 a=new Funcionario2();
        a.setCargo(new Especialista());
        System.out.println(a.getCargo().calculaSalario()); //mostra o conteúdo da classe Especialista
        a.setCargo(new Bibliotecario());
        System.out.println(a.getCargo().calculaSalario());//mostra o conteudo de Bibliotecario.
        a.getCargo().testaAdm(); // aqui esta o problema... não funciona... bah!

    }

}
. Quando digo que não consigo usar é quando crio um objeto na classe TestaFuncionario... Como faço para rodar um metodo usando polimorfismo quando não foi declarado na primeira interface ou classe? . A codificação da classe Funcionario2() é esta. . .
public class Funcionario2 {
	private String nome;
	private String endereco;
	private double salario;
	private Cargo cargo; [b] //aqui esta o ponto onde é gerado a ligação com a interface Cargo...[/b]
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	public String getEndereco() {
		return endereco;
	}
	public void setEndereco(String endereco) {
		this.endereco = endereco;
	}
	
	public Cargo getCargo() {
		return cargo; [b]// aqui eu obtenho acesso a interface Cargo e ao cargo escolhido, se especialista ou bibliotecario.[/b]
	}
	
	public void setCargo(Cargo cargo) {
		this.cargo = cargo; [b]// usado para mudar de cargo....[/b]
	}
	
	public void setSalario(double s)
	{
		[b]//Parei com isso quando naõ consegui implementar o ponto de minha duvida.
	}[/b]
	
	

}
Bem é isso. E novamente pergunto... esta mais ou menos parecido com o padrão Strategy hehe... só vou treinar outro padrão quando eu zerar este ai! See ya! ________ .:N:.

4 Respostas

Vini_Fernandes

Cara, o problemas esta no fato de que sua classe Funcionario2 possui um Cargo, sendo que voce deseja que ela tenha um CargoAdministrativo, isto eh, voce tem que alterar o atributo Cargo para CargoAdministrativo. Outra alternativa, porem menos elegante, eh a realizacao de um casting para o tipo CargoAdministrativo no momento da chamada. Veja abaixo:

public class Funcionario2{
   private CargoAdministrativo cargo;

   public Funcionario2(CargoAdministrativo cargo){
       this.cargo = cargo;
   }
}

ate.

M

Fala nekiess.

É o seguinte: se o seu método não está declarado na interface Cargo, você não pode chamar esse método a partir de uma variável que é do tipo Cargo. Mesmo que na instância real do objeto(Bibliotecário por exemplo) você implemente esse método, não é possível.

M

E sim, o Strategy e mais ou menos isso. O Strategy te dá a possibilidade de alterar a implementação real de um atributo de forma dinâmica. Esse atributo deve ser de um tipo abstrato(no sentido de poder ter várias implementações, interface por exemplo) assim para você alterar o comportamento do objeto ao qual esse atributo aponta, basta você alterar a implementação real.

nekiess

Vini Fernandes:
Cara, o problemas esta no fato de que sua classe Funcionario2 possui um Cargo, sendo que voce deseja que ela tenha um CargoAdministrativo, isto eh, voce tem que alterar o atributo Cargo para CargoAdministrativo. Outra alternativa, porem menos elegante, eh a realizacao de um casting para o tipo CargoAdministrativo no momento da chamada. Veja abaixo:

public class Funcionario2{
   private CargoAdministrativo cargo;

   public Funcionario2(CargoAdministrativo cargo){
       this.cargo = cargo;
   }
}

ate.

.:N:.


Blz Vini… o problema é que trabalhando assim eu perderei o dinamismo que estou testando no problema, mas valeu man…
.
Marcus, agora que sheisser isso, eu pensei que houvesse alguma forma de acessar aquele metodo acessando a interface Cargo… mas bah.
.


.:N:.

Criado 29 de outubro de 2010
Ultima resposta 29 de out. de 2010
Respostas 4
Participantes 3