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

Dúvida sobre uso de Interface

Olá. Seguindo o exemplo da aula, acabou surgindo uma dúvida sobre Interfaces, mais especificamente sobre a "leitura" do código. Por exemplo, quando eu estou na classe TesteSistema, eu crio um objeto Gerente e ponho ele para autenticar...

public class TesteSistema {
    public static void main(String[] args) {
        Gerente g = new Gerente();
        g.setSenha(2222);

        SistemaInterno si = new SistemaInterno();
        si.autentica(g);
    }
}

Eu quero entender o funcionamento do "autentica" (SistemaInterno), portando uso o inspecionar nele. Imediatamente eu sou redirecionado para a classe SistemaInterno. Até aí tudo bem, mas é agora que vem o pulo do gato!

public class SistemaInterno {
    private int senha = 2222;

    public void autentica(Autenticavel a) {
        boolean autenticou = a.autentica(this.senha);
        if (autenticou) {
            System.out.println("Pode entrar no sistema");
        } else {
            System.out.println("Não pode entrar no sistema");
        }
    }
}

Agora eu quero entender o funcionamento do "autentica" que está relacionado ao objeto passado como parâmetro ( a.autentica(this.senha) ), porém ao invés de ser levado para uma implementação, eu acabo caindo na interface.

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

    public abstract boolean autentica(int senha);
}

Ou seja, eu continuo sem saber o que está acontecendo. Como eu faço para saber qual o método que está sendo chamado a partir do "autentica" do SistemaInterno? Eu preciso sempre voltar para TesteSistema e abrir o objeto específico (para saber o que está sendo chamado), para daí encontrar o método implementado? Ou existe uma forma mais fácil de fazer isso?

2 respostas
solução!

Oie Samuel, tudo bem contigo?

O método "autentica" que está sendo chamado é do classe "Gerente", o que acontece quando você vai inspecionar é que por conta da classe "Gerente" implementar a interface "Autenticavel", é possível se utilizar do polimorfismo, ou seja referenciar um objeto "Gerente" a uma interface "Autenticável", e é isso que acontece nesse momento: Autenticavel a, que é quando o método "autentica" aceita receber um objeto do tipo "Gerente". E ai quando você vai inspecionar o a.autentica(this.senha);, esse método que é chamado tem como origem a interface "Autenticavel", mas ele é implementado na classe "Gerente", e isso acontece justamente por conta dessa classe implementar essa interface, mas quando inspecionamos o método ele nos leva para aonde surgiu esse método, que é na interface "Autenticavel".

Quanto a uma forma mais facil de se procurar a implementação no eclipse, se houver eu desconheço. O que dá para fazer é pesquisar o nome da classe desejada e ele te levar até ela clicando em uma lupa que se encontra no canto superior direito:

Foto mostrando a localização da lupa

Espero ter conseguido ajudar, qualquer outra dúvida fico a disposição :)

Bons estudos!

Oi, Igor! Obrigado pelas dicas! Eu acho que encontrei uma solução que se adequa com aquilo que eu estava procurando. Manter o CTRL pressinado antes de clicar no método abre um menu flutuante com duas opções: "Open Declaration", "Open Implementation". Se eu clicar em "Open Implementation", ele me pergunta para qual classe eu desejo ver a implementação, e era isso que eu estava buscando :)

Insira aqui a descrição dessa imagem para ajudar na acessibilidade