1
resposta

Dificuldade em entender Herença(polimorfismo).

Prezados,

A logica do funcionamento do Projeto bytebank- Herdado ficou bem clara, mas a forma que os paramentos é passado de Class Testa que chama uma CLasse A, Chama outra classe ficou copmplicado o entendimento. Vamos lá:

Classe FuncionarioAutenticavel, SistemaIterno, Gerente, Administrador e TesteSistema.

public abstract class FuncionarioAutenticavel extends Funcionario {


    private int senha;

    public int getSenha() {
        return senha;
    }

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

    public boolean autentica(int senha) {    
        if (this.senha == senha) {
            return true;
        }        
        return false;
    }
}
public class SistemaInterno {
    private int senha = 2222;

    public void autentica(FuncionarioAutenticavel fa) {
        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");
        }
    }
}
public class Gerente extends FuncionarioAutenticavel{

    public double getBonificacao() {    
        System.out.println("boniificacao do gerente");
        return super.getSalario();
    }    

}
public class Administrador extends FuncionarioAutenticavel{

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

public class TesteSistema {

    public static void main(String[] args) {

        Gerente g = new Gerente();        
        g.setSenha(2222);

        Administrador adm = new Administrador();        
        adm.setSenha(3333);

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

    }

}

O que desejo. Explicação de como o valor "2222" e "3333" vai pecorrer as classes envolvidas, inclusive quando é comparada com uma senha padrão=2222

Obrigado!

1 resposta

Olá Danilo, tudo bem com você?

Ok, vamos por partes. Primeiro, nós sabemos que a senha correta ("2222") foi declarada dentro da classe SistemaInterno, assim como o método autentica(FuncionarioAutenticavel fa) que ficou responsável por verificar se o FuncionarioAutenticavel que for passado como argumento para o método está com a senha correta.

Tendo isso em mente, quem é o FuncionarioAutenticavel que pode ser passado como argumento para comparar suas respectivas senhas com a senha correta do SistemaInterno? Bom, qualquer classe que herda de FuncionarioAutenticavel, que no caso são o Gerente e o Administrador:

public class Gerente extends FuncionarioAutenticavel{

    public double getBonificacao() {    
        System.out.println("boniificacao do gerente");
        return super.getSalario();
    }    

}
public class Administrador extends FuncionarioAutenticavel{

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

Agora que sabemos qual é o papel de cada classe do nosso sistema, precisamos prestar atenção no método autentica(FuncionarioAutenticavel fa) da classe SistemaInterno e no método autentica(int senha) da classe FuncionarioAutenticavel. Quando testamos nossas classes em TesteSistema, primeiro nós atribuímos uma senha diferente para a instância de Gerente e Administrador, lembrando que ambos herdam FuncionarioAutenticavel.

Gerente g = new Gerente();        
g.setSenha(2222);

Administrador adm = new Administrador();        
adm.setSenha(3333);

Depois, instanciamos o SistemaInterno e chamamos o método si.autentica() para checarmos se as senhas estão corretas. Então, analisando o método de autenticação do SistemaInterno:

public class SistemaInterno {
    private int senha = 2222;

    public void autentica(FuncionarioAutenticavel fa) {
        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");
        }
    }
}

A primeira coisa que fazemos é chamar o método de mesmo nome, fa.autentica(this.senha) da classe FuncionarioAutenticavel para que possamos verificar se a senha "2222" (this.senha) é igual à senha do FuncionarioAutenticavel (que pode ser o Gerente ou o Administrador):

// "int senha" passada como argumento eh a senha correta "2222"
public boolean autentica(int senha) {
    // como agora estamos na classe FuncionarioAutenticavel, o "this.senha" representa a senha que atribuimos ao gerente e ao administrador
    if (this.senha == senha) {
        return true;
    }        
    return false;
}

Por fim, o método retorna pode retornar os valores booleanos true, caso a senha seja "2222" também, ou false, caso a senha esteja errada. Voltando para o método do SistemaInterno, armazenamos esse valor booleano na variável autenticou:

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

E, por fim, fazemos um if e else que retornam uma mensagem no console de acordo com o resultado da autenticação:

if (autenticou) {
    System.out.println("Pode entrar no sistema");
} else {
    System.out.println("Não pode entrar no sistema");
}

Ficou um pouco extenso, mas espero que tenha ajudado. Mas se algum ponto ainda não ficou claro ou se nem era essa a sua dúvida, por favor, me avise! Embora eu acredite que o mais importante seja lembrar que desde que a classe Gerente e Administrador herdem de FuncionarioAutenticavel, ambas podem ser passadas como argumentos no método autentica(FuncionarioAutenticavel fa).

Forte abraço e bons estudos!!