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

E se o código do método autentica() não muda?

Ao assistir a aula de Interfaces, antes mesmo da aula terminar eu fiquei incomodado com uma coisa:

E se o código do método autentica() for o mesmo pra todas as classes que o implementarem e eu tiver que alterar o código desse método? Será que eu vou ter que caçar todas as classes que implementam esse método e alterar o código de todas, uma a uma?

Daí eu comecei a pesquisar e ancontrei alguém de quem já ouvi falar na faculdade, mas ainda não tive a oportunidade de implementar: Delegação.

Nós podemos deixar a responsabilidade de autenticar com uma classe própria para isso. Ficaria algo assim:

class Autenticador implements Autenticavel{
    public boolean autentica(int senhaCorreta, int senhaInput){
        if(senhaCorreta != senhaInput){
            return false;
        }
        return true;
    }
}
class Gerente extends Funcionario implements Autenticavel {
    private int senha;

    public boolean autentica(Autenticador autenticador, int senhaInput) {
         return     autenticador.autentica(this.senha, senhaInput);
    }
}

O benefício aqui é que se a lógica de autenticação precisar ser alterada no futuro, sera necessário alterar somente o código da classe Autenticador.

(fonte: http://www.guj.com.br/t/resolvido-agregacao-e-delegacao/57438/4)

4 respostas

Ola Hélio! Sim, delegação é muito utilizada em linguagem OO. Ela não foi utilizada na explicação pois o objetivo não era que todos os métodos tenham a mesma regra de negocio. Mas muito boa sua observação e iniciativa.

Bons Estudos!

Muito útil essa técnica de delegação, irei testar pra verificar seu funcionamento.

Esse exemplo está meio estranho.

Da forma com que você construiu, a Interface Altenticavel de ter dois metodos:

public interface Altenticavel {    
    boolean altentica(int senhaUsuario, int senhaInput);

    boolean altentica(Altenticador altenticador, int senhaInput);
}

O que força as duas classes, Altenticador e Funcionario a implementam ter esses dois métodos também. O que quebra a lógica do código.

Daria certo se a classe Altenticador não implementasse Altenticavel e o método na Interface Altenticavel implementasse apenas o método:

public interface Altenticavel {    
    boolean altentica(Altenticador altenticador, int senhaInput);
}

Ou estou enganado?

solução!

Desculpe pessoal, esse "implements Autenticavel" na Classe Gerente não deveria existir. Falha minha. O código correto é esse:

class Gerente extends Funcionario implements Autenticavel {
    private int senha;

    public boolean autentica(Autenticador autenticador, int senhaInput) {
         return     autenticador.autentica(this.senha, senhaInput);
    }
}

O propósito de utilizar a delegação neste caso é justamente retirar o papel de autenticação dos funcionários.

Bruno, obrigado pela observação. Não sei se é possível alterar um tópico já postado, mas se puder eu peço que algum administrador faça isso por favor.

Pra completar, deixo uma frase repetida muitas vezes pelo meu professor de Engenharia de Software, que eu só consegui entender ontem:

"A delegação é mais genérica que a generalização"