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

Aula 07 - Atividade 01 - Código repetido

Boa tarde!

Quando não queremos repetir código, devemos utilizar Composição. As Classes Cliente, Administrador e Gerente estão utilizando AutenticacaoUtil. Isso deveria evitar a repetição, mas não foi o que aconteceu.

Seguem os códigos.

Cliente.java

public class Cliente implements Autenticavel {
    private AutenticacaoUtil autenticador;

    public Cliente() {
        this.autenticador = new AutenticacaoUtil();
    }

    @Override
    public void setSenha(int senha) {
        this.autenticador.setSenha(senha);
    }

    @Overridepublic boolean autentica(int senha) {
        return this.autenticador.autentica(senha);
    }
}

Administrador.java

public class Administrador extends Funcionario implements Autenticavel {
    private AutenticacaoUtil autenticador;

    public Administrador() {
        this.autenticador = new AutenticacaoUtil();
    }

    @Override
    public void setSenha(int senha) {
        this.autenticador.setSenha(senha);
    }

    @Override
    public boolean autentica(int senha) {
        return this.autenticador.autentica(senha);
    }

    @Override
    public double getBonificacao() {
        return 50;
    }
}

Gerente.java

public class Gerente extends Funcionario implements Autenticavel {
    private AutenticacaoUtil autenticador;

    public Gerente() {
        this.autenticador = new AutenticacaoUtil();
    }

    @Override
    public void setSenha(int senha) {
        this.autenticador.setSenha(senha);
    }

    @Override
    public boolean autentica(int senha) {
        return this.autenticador.autentica(senha);
    }

    @Override
    public double getBonificacao() {
        return super.getSalario();
    }
}

Os Métodos setSenha e autentica não estão repetidos nas 3 Classes?

Pelo que eu entendi, não tem jeito de evitar isso. Ou tem?

2 respostas
solução!

Oi Jonas, repare que antes o método autentica era implementado dessa maneira pelas classes Cliente, Administrador e Gerente:

@Override
    public boolean autentica(int senha){

        if(this.senha == senha){
            return true;
        } else {
            return false;
        }
    }

E agora está apenas na classe AutenticaoUtil e as demais chamam o método pelo atributo autenticador:

@Override
    public boolean autentica(int senha) {
        return this.autenticador.autentica(senha);
    }

Portanto, acabou evitando a repetição da implementação do método autentica nessas três classes.

Espero ter ajudado e bons estudos!

Bom dia Thais! Obrigado pela resposta!

O que eu quis dizer foi que essas pequenas repetições:

    @Override
    public void setSenha(int senha) {
        this.autenticador.setSenha(senha);
    }
    @Override
    public boolean autentica(int senha) {
        return this.autenticador.autentica(senha);
    }

São inevitáveis.

Pois precisamos sobrescrever os Métodos setSenha e autentica da Interface Autenticavel:

public abstract interface Autenticavel {
    public abstract void setSenha(int senha);
    public abstract boolean autentica(int senha);
}