Duvida sobre herança e polimorfismo

9 respostas
D

Bom dia!

Estou com duas classes aqui… funcionário e gerente… gerente é subclasse de funcionário… seguindo o conceito de que gerente é um funcionario…

como não quero que sejam instanciados funcionários, coloquei-a como classe abstrata… e tenho um método abstrado nesse classe funcionario, chamado “promove()” … ele altera o nivel do gerente ( de B para A, por exemplo … )

Acontece que agora gostaria de criar uma classe diretor, que extenda de funcionario, mas nao gostaria que ela tivesse o método promove… e sou obrigado a colocar, caso contrario nao compila…

Qual seria a forma mais correta de agir, neste caso?

Obrigado =)

9 Respostas

Deh

você poderia criar uma interface, que tenha o método “promover()”, e implementar somente nas classes que acha necessário!

http://www.guj.com.br/posts/list/49267.java

nesse tópico aqui tem uma mega-aula do nosso colega mantu =]

cassio

Eu penso da seguinte maneira:

  1. Não implementa o método promove(). Se ele retornar void, simples. fica um método inútil que não faz nada e não oferece perigo. Se retornar boolean põe ele pra retornar sempre false, quer dizer, seu diretor nunca será promovido.

  2. Cria duas interfaces para funcionários: FuncionarioPromovivel e FuncionarioNaoPromovivel. O segundo tipo não possui o método promove();

  3. Idéia semelhante a do item 2, porém com método abstrato.

A melhor solução depende da sua aplicação mesmo… :slight_smile:

D

Vou dar uma olhada!
Obrigado!

D

Preferi criar a interface Promovivel… funcionou legal =)

Outra duvida… se eu quiser utilizar o polimorfismo, junto com isso… e fazer algo parecido com isso:

Funcionario g1;

g1 = new Gerente(Eduardo Amuri,442243133,1000);

g1.promove();

Porque ele não deixa, sendo que g1 é um gerente? ( lembrando que Funcionario é abstrato.

tks!

cassio

posta o código da interface e da(s) classe(s) ai!

D

A classe abstrata Funcionario…

abstract public class Funcionario
{	
	protected String nome;
	private String RG;
	protected double salario;
	private boolean status = false; 

	Funcionario() {}
	Funcionario(String nome, String RG, double salario)
	{
		this.nome = nome;
		this.RG = RG;
		this.salario = salario;
	}
	
	public String toString()
	{
		return "Nome: " + this.nome + " | Salario: " + this.salario;
	}
}
public class Gerente extends Funcionario implements Promovivel
{
	String nota = "Junior";
	
	Gerente() {}
	
	Gerente(String nome, String RG, double Salario)
	{
		super(nome,RG,Salario);
	}
	
	public void bonifica(double val)
	{
		this.salario = this.salario + val;
	}
	
	public String getNota()
	{
		return nota;
	}
	
	public void alteraNome(String newNome)
	{
		this.nome = newNome;
	}
	
	public void aumentaSalario()
	{
		this.salario = this.salario + 8;
	}
	
	public boolean promove()
	{
		if(nota == "Junior") { nota = "Pleno"; return true; } 
		if(nota == "Pleno") { nota = "Senior"; return true; }
		if(nota == "Senior") { nota = "O Foda!"; return true; }
		if(nota == "O Foda!") System.out.println("Nao tem para onde ir... tchau!");
		return false;
	}
	
	public String toString()
	{
		return super.toString() + " | Nota: " + this.nota;
	}
}

e a interface…

interface Promovivel {
	
	boolean promove();

}

Muito obrigado =)

cassio

Apesar da sua classe Gerente implementar a interface Promovivel, como ela estende Funcionario, o extends acaba “prevalecendo” sobre o implements. Logo, para que vc pudesse utilizar o método promove() com essa estrutura de classes que você criou, seria necessário que a classe abstrata Funcionario tivesse o método promove(), o que não acontece…

peczenyj

Aviso:

//ao inves de nota == "Junior" // use o metodo equals nota.equals("Junior")

== testa se as referencias,
equals testa a igualdade de valores, nesse caso sobrecarregado para a classe String com este objetivo.

D

Existe alguma lógica que eu possa usar, que faça mais sentido?

Não contava com essa “prioridade” … hehehe

Criado 17 de janeiro de 2007
Ultima resposta 17 de jan. de 2007
Respostas 9
Participantes 4