Erro no método!

5 respostas
EDIMIL

Amigos estou tendo problema com o método getHoras que não está sendo reconhecido pela classe curso, o código é um pouco grande por isso vou colocar apenas as classes mais envolvidas, se alguém poder me ajudar, ficarei muito grato, eis as classes:

public class Funcionario {
    private String Nome;
    private int Identificacao;
    private int Horas;
    private double ValorHora;
        
    public Funcionario (String nome, int id) {
        this.Nome = nome;
        this.Identificacao = id;
    }
    
    public void setValorHora(double VHora) {
        this.ValorHora = VHora;
    }
    
    public String getNome() {
        return this.Nome;
    }
    
    public int getIdentificacao() {
        return this.Identificacao;
    }
    
    public int getHora() {
        return this.Horas;
    }
    
    public double getValorHora() {
        return this.ValorHora;
    }
    
    public double getSalario() {
        return getHora() * getValorHora();
    }    
   
    public void setHoras(int h) {
        this.Horas = h;
    }
}
public class Administrativo extends Funcionario {
    private int HorasAdm;
    
    public Administrativo(String aNome, int aId) {
        super(aNome, aId);
        this.HorasAdm = 0;
    }
    
    public void setHorasAdm(int h) {
        this.HorasAdm = h;
    }
    
    public int getHoras() {
        return this.HorasAdm + super.getHora();
    }
    
    public int getHorasAdm() {
        return HorasAdm;
    }
    
    public double getSalario() {
        return (getHorasAdm() * getValorHora()) + super.getSalario();
    }
}
public class Docente extends Funcionario {
    private int HorasAula;
    
    public Docente (String aNome, int aId) {
        super(aNome, aId);
        this.HorasAula = 0;
    }
    
    public void setHorasAula(int h) {
        this.HorasAula = h;
    }
    
    public int getHoras() {
        return HorasAula + super.getHora();
    }
    
    public double getHorasDoc() {
        return HorasAula * getValorHora();
    }
    
    public double getSalario() {
        return getHorasDoc() + super.getSalario();
    }
}
public class Pesquisador extends Funcionario {
    private int HorasPesq;
    
    public Pesquisador(String aNome, int aId) {
        super(aNome, aId);
        this.HorasPesq = 0;
    }
    
    public void setHorasPesq(int h) {
        this.HorasPesq = h;
    }
    
    public int getHorasPesq() {
        return HorasPesq;
    }
    
    public int getHoras() {
        return HorasPesq + super.getHora();
    }
    
    public double getSalario() {
        return super.getSalario() + (getHorasPesq() * getValorHora());
    }
}
import javax.swing.*;

public class Curso {
    private String Nome;
    private Funcionario [] func;
    private int index = 0;
    
    public Curso(String aNome, int qtFunc) {
        func = new Funcionario [qtFunc];
        this.Nome = aNome;
    }
    
    public void addFuncionario(Funcionario aFunc) {
        func[index] = aFunc;
        index ++;
    }
    
    public void GeraFolhaPagamento() {
        for (int i = 0; i < func.length; i++) {
            JOptionPane.showMessageDialog(null,"Curso: " + this.Nome
            + "\n" + "Funcionário: " + func[i].getNome()
            + "\n" + "Horas trabalhadas: " + func[i].getHoras()         \ erro aqui(getHoras)
            + "\n" + "Salário: " + func[i].getSalario()
            + "\n" + "-------------------------------");
        }
    }
}

5 Respostas

Andre_Brito

É porque os nomes estão diferentes.

Muda nessa sua classe Curso pra getHora() ou na classe Funcionario pra getHoras().

Abraço.

EDIMIL

dedejava, mas são dois métodos mesmo, o método getHora da classe funcionario vai receber apenas um tipo de horas, as horas normais, e o método getHoras das classes herdeiras vai ser o somatório das horas normais (super.getHora) com as horas adicionais para aparecer no relatório, o getSalario da classe Funcionario é o produto de getHora por getValorHora e o getSalario das classes herdeiras foi sobrescrito sendo super.getSalario + (getHorAdm * getValorHora) que é o mesmo que salario de funcionario + salario de administrativo e aí tem solução pra isso?

ViniGodoy

Nesse caso, você precisa informar ao Java que a classe funcionário tem uma função chamada getHoras, mas que sua implementação só ocorre nas classes filhas. Você faz isso declarando a classe Funcionario como abstract e colocando a função getHoras como abstract por lá também:

public abstract class Funcionario {
    private String Nome;
    private int Identificacao;
    private int Horas;
    private double ValorHora;
        
    public Funcionario (String nome, int id) {
        this.Nome = nome;
        this.Identificacao = id;
    }
    
    public void setValorHora(double VHora) {
        this.ValorHora = VHora;
    }
    
    public String getNome() {
        return this.Nome;
    }
    
    public int getIdentificacao() {
        return this.Identificacao;
    }
    
    public int getHora() {
        return this.Horas;
    }
    
    public double getValorHora() {
        return this.ValorHora;
    }
    
    public double getSalario() {
        return getHora() * getValorHora();
    }    
   
    public void setHoras(int h) {
        this.Horas = h;
    }

    //Todos os filhos implementarão essa função um dia
    public abstract int getHoras(); 
}
Como a classe funcionário agora é abstrata, você não poderá mais fazer:
Funcionario func = new Funcionario();
Mas pode fazer:
Funcionario func = new Pesquisador();
Chamar
func.getHoras();

Irá chamar o getHoras do objeto que estiver atribuído ao funcionário (no caso acima, o Pesquisador) graças ao polimorfismo. O Java também reclamará se você tentar implementar uma classe filha e esquecer do método getHoras(), a menos que essa classe filha também seja abstract.

EDIMIL

Valeu dedejava, você é fera mesmo!

ViniGodoy

Ok, ele é.
Mas se foi para mim, eu não sou o DedeJava.

Ou era mesmo sobre a primeira resposta que vc falou? :lol:

Criado 31 de dezembro de 2007
Ultima resposta 2 de jan. de 2008
Respostas 5
Participantes 3