Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Solucionado (ver solução)

Funcionamento do SistemaInterno, TesteSistema e Gerente

Olá!

Gostaria de saber se estou analisando corretamente o código, pois surgiu uma dúvida ao final do meu raciocínio e não consegui resolver.

Meu raciocínio é o seguinte:

No SistemaInterno, é criado um método público (public) sem retorno (void) chamado "autentica", tendo como parâmetro de entrada uma variável local "fa" que precisa ter a interface "Autenticável". Conclui isso dessa parte do código:

public void autentica(Autenticavel fa) {

Dado que toda interface possui apenas métodos com empty bodies, a entrada precisa ter um override dos métodos da interface "Autenticável". Esses métodos são:

public abstract void setSenha(int senha) ;

public abstract boolean autentica(int senha) ;

Sendo assim, e dado que Gerentes e Administradores implementam tanto o "setSenha" quanto o "autentica" (ou seja, há uma reescrita, usando as mesmas assinaturas, mas com corpo), Gerentes e Administradores são uma entrada possível do "public void autentica(Autenticavel fa)" do SistemaInterno.

Depois disso, há uma comparação entre a senha do objeto do tipo "Autenticável" que está na referência "fa" com o valor true or false de uma variável booleana:

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

Por fim, no TesteSistema, temos:

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

O "autentica", nesse caso, parece chamar tanto o método do SistemaInterno quanto o seguinte método do Gerente:

@Override
public boolean autentica(int senha){

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

Como o "si.autentica(g)" chama, ao mesmo tempo, tanto o "autentica" do Gerente quanto o "autentica" do SistemaInterno e compara os dois, se foi feita apenas uma chamada, e que não parece relacionar os dois explicitamente?

Ainda: pelo o que vimos em polimorfismo, não deveria ocorrer apenas o método mais específico?

E qual tópico devo estudar melhor para entender mais intuitivamente essa minha dúvida?

Obrigado!

2 respostas

Acho que descobri! Nessa parte do código:

    boolean autenticou = fa.autentica(this.senha);

Na verdade o "fa.autentica" está chamando o método da interface Autenticavel, e esse é substituído pelo método mais específico do Gerente, Diretor etc (polimorfismo com a interface?) de acordo com a referencia utilizada (exemplo: g1, d1 etc), tendo como parâmetro de entrada a senha do SistemaInterno.

Dessa forma, teríamos um "g1.autentica" (Gerente) e um "d1.autentica" (Diretor) lá no TesteSistema - mais precisamente, objetos do tipo Gerente e Diretor, com referencias "g1" e "d1", objetos esses que foram instanciados das respectivas classes Gerente e Diretor.

E o ponto do código que faz a comparação de valores seria, portanto, justamente o "fa.autentica(this.senha)" do SistemaInterno, possível graças ao implements da interface Autenticavel.

Seria isso?

Obrigado!

solução

Boa noite, André! Como vai?

Sim, é isso mesmo! Vc está correto!

Qualquer coisa é só falar!

Grande abraço e bons estudos, meu aluno!