Duvida sobre polimorfismo

.: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.

.
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.
.

.
.
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().

[code]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!

}

}
[/code]
.
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:.

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.

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.

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.

[quote=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.[/quote]

.: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:.