Dúvida com implementação de interface

Estou tentando fazer o seguinte exemplo:

public class PrincipalFuncionario {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int qtdFunc;
        System.out.println("Quantidade de funcionarios a cadastrar:");
        qtdFunc = sc.nextInt();

        Funcionario f = new Funcionario();
        f.lista_func = new Funcionario[qtdFunc];
        int escolha = 0;


        do {
            System.out.println("Escolha a opção:\n1-Cadastrar\n2-Localizar\n3-Sair");
            escolha = sc.nextInt();
            switch (escolha) {
                case 1:
                    f.cadastrar();
                    break;
                case 2:
                    f.localizar();
                    break;
                case 3:
                    System.exit(0);
            }

        } while (escolha <= 3);

       

    }
}
public class Funcionario{

    Funcionario[] lista_func;
    protected String nome;
    protected String cpf;
    protected double salario;
    private int cont=0;

    public String getCpf() {
        return cpf;
    }

    public void setCpf(String cpf) {
        this.cpf = cpf;
    }

    public String getNome() {
        return nome;
    }

    public double getSalario() {
        return salario;
    }

    Funcionario(){

    }

    Funcionario(String nome, String cpf, double salario){
        this.nome = nome;
        this.cpf = cpf;
        this.salario = salario;
    }

    void mudarNome(String nome){
        this.nome = nome;
    }

    void mudarSalario(double salario){
        this.salario = salario;
    }

    void mostra(){
        System.out.println("Nome: "+this.nome+"\nCPF: "+this.cpf+"\nSalario: "+this.salario);
    }

    void cadastrar(){
        Scanner sc = new Scanner(System.in);
        System.out.println("Que tipo de funcionario deseja cadastrar?\n1-Gerente\n2-Supervisor\n3-Atendente");
        int tipo = sc.nextInt();
        if (cont < lista_func.length){
            switch(tipo){
                case 1: lista_func[cont] = new Gerente();
                case 2: lista_func[cont] = new Supervisor();
                case 3: lista_func[cont] = new Atendente();
            }
            Bonifica b = new Gerente();

            System.out.println("Nome do Funcionario:");
            lista_func[cont].mudarNome(sc.next());
            System.out.println("CPF do Funcionario:");
            lista_func[cont].setCpf(sc.next());
            System.out.println("Salario do Funcionario:");
            lista_func[cont].mudarSalario(sc.nextDouble());
            cont++;
        }else{
            System.out.println("Quantidade Limite Atingida!");
        }
    }

    void localizar(){
        Scanner sc = new Scanner(System.in);
        boolean achou = false;
        System.out.println("Digite o nome:");
        String nfunc = sc.next();
        for (int i=0;i<cont;i++){
            if (lista_func[i].getNome().equals(nfunc)){
                int esc=0;
                System.out.println("1-Mudar Nome\n2-Mudar Salario\n3-Bônus");
                esc = sc.nextInt();
                switch(esc){
                    case 1: System.out.println("Digite o novo nome:");
                                lista_func[i].mudarNome(sc.next());break;
                    case 2: System.out.println("Digite o novo salario:");
                                lista_func[i].mudarSalario(sc.nextDouble());break;
                    case 3: System.out.println("Valor do bonus:");
                                //
                                //
                                //
                    }
                achou = true;

            }
            if (!achou){
                System.out.println("Registro não encontrado!");
            }
        }
    }

}
public class Gerente extends Funcionario implements Bonifica{

    public void bonifica(double valor){
        this.salario = this.salario + this.salario * 18/100 + valor;
    }


}
public class Supervisor extends Funcionario implements Bonifica{

    public void bonifica(double valor){
        this.salario = this.salario + this.salario * 15/100 + valor;
    }


}
public interface Bonifica {

    public void bonifica(double valor);

}

Na classe Funcionario no case 3, preciso chamar o metodo bonifica de acordo com o objeto - Gerente / Supervisor, mas não estou conseguindo.

Alguém pode me ajudar?

Desculpem o codigo grande.

Porque não consegue?

Via de regra, o método bonifica a ser chamado será aquele referente ao objeto que você está chamando…

ok?

Bom… não sei se entendi seu problema, mas eu faria o seguinte:

A classe Funcionario implementaria o método bonifica da interface e as classes Gerente e Supervisor iriam sobrescrever este método, já que elas são sub classes de Funcionario. Creio que assim poderá chamar o método, que será distinguido de acordo com a instância que você vai utilizar(Gerente ou Supervisor).

Faça algo assim:

case 3: System.out.println("Valor do bonus:");
if( lista_func[i] implements Bonifica )
{
    (Bonifica)(lista_func[i]).bonifica( sc.nextDouble() );
}

vc quer usar Polimofismo?? eh isso?!

Na verdade eu gostaria de solucionar o problema usando ou não Polimorfismo!!

Não funcionou, dá erro nas duas linhas; com base na idéia tentei fazer o seguinte:

Mas tb não deu certo;

Obrigado.

Afinal, qual o problema que você está enfrentando, pode explicá-lo? :smiley:

O que quero fazer é aparentemente simples, como fazê-lo é o problema.

Eu quero acessar o método bonifica da Classe Gerente, quando o objeto criado for um gerente, acessa o método bonifica da Classe Supervisor, quando o objeto criado for um supervisor; onde o método bonifica faz parte da Interface bonifica implementada pelas Classes Gerente e Supervisor. Não quero esse método na Classe Funcionario, já q tenho outra classe q tb herda dela q não deve ter o método bonifica.

Obrigado

fajo

Se você tem um objeto do tipo Gerente e acessa o método bonifica, ele vai acessar o método bonifica da classe Gerente… exemplo…

Gerente g = new Gerente();
g.bonifica(300);

Entretanto, se você tiver um objeto do tipo Supervisor, ele chamará o método bonifica do supervisor… isso já é resolvido pelo Java…

No seu código, percebi que gerente herda de Funcionário… mesmo que haja um método bonifica em funcionário, ele executará o do gerente ou o do supervisor, ele só executará o do funcionário se você explicitamente ordenar que ele o faça… ok?

Você está tendo algum problema com esse método, ele não está executando no objeto correto?

renamed

Isso eu sei, o problema é que os objetos, Gerente e Supervisor estão sendo criados aqui:

.
.
        if (cont < lista_func.length){
            switch(tipo){
                case 1: lista_func[cont] = new Gerente();
                case 2: lista_func[cont] = new Supervisor();
                case 3: lista_func[cont] = new Atendente();
            }
.
.

ou seja, com polimorfismo, já que o Array é do tipo Funcionario.

desta forma quanto tento acessar o método bonifica digitando

lista_func[cont].bonifica(valor)

ele não está disponível, exatamente pq na classe Funcionario não tem esse método; e eu não quero que tenha, já q eu tenho uma outra Classe Atendente que herda de Funcionairo mas q não deve ter o método bonifica, por isso implementei uma interface.

Casting não funciona nesse caso?

Boa tarde.

Porque não tenta algo do tipo:

Gerente g = lista_func[cont]; g.bonifica(valor);

Já que o array está guardando um objeto do tipo Gerente. O mesmo seria verdade para supervisor, o que acha?

Ah! Responda a pergunta do blaine também :slight_smile:

Abraço.

cara, vc tem duas opções…

  1. Criar um método em Atendente que calcule seu bônus como zero (return 0)… acho que isso não seria problema, vc só estaria dizendo que atendente não tem bônus…
  2. fazer o seguinte código… o q pr mim e horrivel…

[code]case 3: System.out.print("Valor do bonus: ");
double bonus = sc.nextDouble();

                            Funcionario f = lista_func[i];
                            
                            if (f instanceof Gerente) {
                            	((Gerente)f).bonifica(bonus);
                            } else if (f instanceof Supervisor) {
                            	((Supervisor)f).bonifica(bonus);
                            }
                            System.out.println("Sal: " + f.getSalario());
                }[/code]

talvez se vc fizer algo como:



Bonifica bonificacao =  new Gerente();
bonificacao.bonifica(valor);

isso é o uso de Polimorfismo por inclusão!

flw!