Ir ao conteúdo
  • Cadastre-se

Java Herança - Acesso de métodos que não estão na classe mãe, o que fazer?


lsnkesp
Ir à solução Resolvido por AdrianoSiqueira,

Posts recomendados

Gente, tenho uma dúvida que pode parecer bem inútil, mas é bem confusa pra mim...

Tô aprendendo herança e tenho as classes Funcionário e Professor, professor herda os atributos de funcionário mas tem uma lista de alunos ao qual ele vai orientar e um método chamado getBonificacao() que não faz parte da classe Funcionário, beleza até aí tudo certo...

O que eu não tô sabendo é pegar a quantidade de gastos de todos os funcionários (tendo em vista que professor também é um), eu até consigo pegar através do método:

public double mostrarGastosFuncionarios() {
		double totalGastosComFuncionarios = 0.0;
		for (String funcionarios : countObjetosFuncionarios.keySet())
			if (funcionarios != null)
				totalGastosComFuncionarios += countObjetosFuncionarios.get(funcionarios).getSalario();
		return totalGastosComFuncionarios;
	}

Minha classe funcionário:

package model.funcionario;

public class Funcionario {

	protected String nome;
	protected String CPF;
	protected Double salario;

    public Funcionario(String nome, String CPF, Double salario) {
		this.nome = nome;
		this.CPF = CPF;
		this.salario = salario;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public String getCPF() {
		return CPF;
	}

	public void setCPF(String cPF) {
		CPF = cPF;
	}

	public Double getSalario() {
		return salario;
	}

	public void setSalario(Double salario) {
		this.salario = salario;
	}

	public String getRelatorio() {
        String relatorio = "Nome: " + getNome();
        relatorio += "\nSalário: " + getSalario();
        return relatorio;
    }

}

Minha classe professor:

package model.funcionario;

import java.util.HashMap;
import java.util.Map;

import model.aluno.Aluno;

public class Professor extends Funcionario {
	Map<String, Aluno> listOrientacao = new HashMap<String, Aluno>();

	public Professor(String nome, String CPF, Double salario) {
		super(nome, CPF, salario);
	}
	
	public Map<String, Aluno> getListOrientacao() {
		return listOrientacao;
	}

	public Double getBonificacao() {
		double novoSalario = 0.0;
		for (String m : listOrientacao.keySet()) {
			novoSalario += super.getSalario() * 0.01;
		}
		return novoSalario;
	}

}

Exemplo se eu cadastro dois professores com salário 2400, a soma retorna 4800 como o total de gastos, mas não retorna o total de gastos + a bonificação (essa bonificação, no caso, é que para cada aluno que o professor orienta, ele ganha 1% do salário), porém não está retornando a soma com essa bonificação, apenas o salário sendo somado.

 

Alguém pode me ajudar? Se precisar de códigos, eu posso colocar aqui, só não sei o que exatamente devo anexar.

 

porque quando eu quero retornar o total de gastos, o que inclui também a bonificação recebida de cada professor (se ele orientar pelo menos um aluno) e eu puxo o mapa de funcionários, não consigo pegar o método getBonificacao() justamente porque não está na classe funcionário e sim na sua classe filha (professor)...

N tenho ideia do que fazer, aguardo retorno.

Link para o comentário
Compartilhar em outros sites

Não é melhor você criar uma interface funcionário? Ou então dexá-la como uma classe abstarct? Porque assim, você concorda que o professor é apenas um funcionário específico? Ele deveria ter todos os métodos bonificações etc. que um funcionário tem, a única diferença é que isso mudaria de funcionário para funcionário. Assim você consegue fazer um "override" nos métodos e aí quando estiver relacionado a professor ele vai fazer os cálculos necessários apenas para aquela subclasse.

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

  • Solução

Se a sua lista é de tipo mais externo (genérico) (Funcionário, no caso), então você precisa fazer um cast. Para fazer o cast com segurança, você usa o operador instanceof dentro de um if para saber se o cast vai dar certo.

 

Resumindo, fica assim:

for (Funcionario funcionario : funcionarios) {
    if (funcionario instanceof Professor) {
        Professor p = (Professor) funcionario;

        double bonificacao = p.getBonificacao();
        double novoSalario = p.getSalario() + bonificacao;

        p.setSalario(novoSalario);
    }
}

 

Para ver o exemplo completo, baixe o pacote.

Professor.zip

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

@lsnkesp Basta sobreescrever o método getSalario na classe filha, retornando o salário já com a bonificação, não é muito intuitivo, mas quando o método mostrarGastosFuncionarios da classe mãe chamar getSalario, o método de fato invocado vai ser o da classe filha e não o da classe mãe.

  • Curtir 1
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

@Felipecfk Sim, concordo. Mas no momento estou fazendo dessa forma, entendo que ficaria mais fácil do seu jeito, mas essa é uma das maneiras em que eu gostaria de saber como faria, neste caso. De qualquer forma, muito obrigada!

@AdrianoSiqueira Obrigada, me ajudou muito. Nesse caso em que você está fazendo, o polimorfismo é mantido? (Só a nível de curiosidade, mesmo) - Vou ajeitar e qualquer coisa posto aqui!

@JorgeGus Valeu, vou tentar aqui, fortaleceu demais!

Opa, gente, fiz as alterações aqui, deu super certo. As duas soluções estão perfeitas, obrigada viu.

Minha classe professor ficou assim:

package model.funcionario;

import java.util.HashMap;
import java.util.Map;

import model.aluno.Aluno;

public class Professor extends Funcionario {
	Map<String, Aluno> listOrientacao = new HashMap<String, Aluno>();

	public Professor(String nome, String CPF, Double salario) {
		super(nome, CPF, salario);
	}
	
	public Map<String, Aluno> getListOrientacao() {
		return listOrientacao;
	}
	
	@Override
	public Double getSalario() {
		double novoSalario = 0.0;
		if(listOrientacao.isEmpty()) {
			return super.getSalario();
		} else {
			for (String m : listOrientacao.keySet()) {
				novoSalario += super.getSalario() * 0.01;
			}
			return novoSalario + super.getSalario();
		}	
	}
}

Agora está retornando da maneira que quero!!!!!

Obrigada, inclusive, Adriano, pela sua ajuda também, com certeza também será um código útil para mim entender como funciona.

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!