Solucionado (ver solução)
Solucionado
(ver solução)
7
respostas

Java 3 - Aula 4 - Exercício 4 - "Porque não funciona?"

Olá. No caso deste exercício mostra uma forma incorreta de autenticar a senha do "gerente". Mas qual seria então a forma correta para autenticar a senha neste caso?

main

Funcionario f = new Gerente();
f.autentica(1234);

Classe Gerente

// Gerente herda classe Funcionário (extends)
public class Gerente extends Funcionario {

    private int senha;

    public void setSenha(int senha) {
        this.senha = senha;
    }

    public boolean autentica(int senha) {
        if (this.senha == senha) {
            return true;
        } else {
            return false;
        }
    }

    public double getBonificacao() {
        System.out.println("Chamando método bonificação Gerente");
        return super.getBonificacao() + super.getSalario();
    }

}

Classe Funcionario

public class Funcionario {

    private String nome;
    private String cpf;
    private double salario;

    public double getBonificacao() {
        return this.salario * 0.05;
    }

    public String getNome() {
        return nome;
    }

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

    public String getCpf() {
        return cpf;
    }

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

    public double getSalario() {
        return salario;
    }

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

}
7 respostas

Fala Kennie, tudo bem?

Forma correta:

Gerente f = new Gerente();
f.autentica(1234);

Abraço!

Olá. Obrigado pela resposta! Mas e no caso que estamos estudando, sobre polimorfismo. Eu não poderia criar um objeto "Gerente" referenciando como "Funcionário" e usar a autenticação que está dentro da classe Gerente? Não entendi muito bem.

Regra: só é possível chamar os métodos do tipo da referência, nesse caso, só o que estiver declarado em Funcionario, ou seja, lado esquerdo do =

Explicação: Por mais que em tempo de execução a gente saiba que aquela referência esteja apontando para um Gerente, e a gente sabe que Gerente tem o método autentica, ao invés de Gerente poderia estar apontando para um Vendedor (ou qualquer outra classe que faz um extends Funcionario e que não necessariamente tem o método autentica), e o objeto vendedor poderia não ter o método autentica. Sendo assim, para evitar que nós tentemos utilizar um método que tem a chance de nem existir no objeto sendo referênciado, o compilador não deixa você chamar o método autentica, pois nem todo mundo que extends Funcionario tem o método autentica.

Entendeu? :)

Sim, isso eu até entendi. Mas qual seria a melhor forma de fazer esta autenticação apenas para os gerentes, usando o polimorfismo ao mesmo tempo (não sei se estou me expressando muito bem). Não seria possível? Ou sempre que criar um gerente precisaria referenciar desta forma que você passou?

solução!

Opa. Para quem tem a mesma dúvida que eu, na aula 06 atividade 01 deste mesmo curso explica melhor essa questão da autenticação. Foi necessário criar uma classe intermediária apenas para as classes filhas que devem receber uma autenticação de senha. Ficou mais claro agora, obrigado pela ajuda Otávio!

Bom dia Kenni, vamos ver se entendi, o que acontece ai é que Funcionário não conhece o method autentica, o que você pode fazer é: uma interface Funcionario que contem todos os métodos comuns entre funcionários, criar uma classe "FuncionarioComum", que implementa essa interface, ai você criar outra classe "FuncionarioComAuth" algo assim, que também implements Funcionario, com mais o method autentica, que o seu Gerente (que necessita de autentificação) extende... ai você pode fazer... tenta ai man, minha explicação meio maluca, mas se escrever o código aqui perde a graça! :D vlws!

//algo assim
FuncionarioComAuth gerente1 = new Gerente();

Fala Thiago, tudo certo? Então, na verdade neste ponto do curso não havia mostrado as interfaces. Mas é justamente esta a sequência das aulas. Na aula 06 resolve esta questão aparentemente da forma como você explicou (estamos implementando agora). Mas obrigado pela ajuda! Abraço.