Como a classe Gerente e Administrador são filhas da classe mãe FuncionarioAutenticavel, não podemos colocar o método autentica no formato abstrato dentro da classe mãe e nas classes filhas utilizar o Override?
Como a classe Gerente e Administrador são filhas da classe mãe FuncionarioAutenticavel, não podemos colocar o método autentica no formato abstrato dentro da classe mãe e nas classes filhas utilizar o Override?
Olá Thomas! Tudo bem?
Ótima observação!
Na situação que o instrutor nos apresenta, temos um diagrama que ele utiliza para representar as classes do nosso projeto, certo?
Observe que inicialmente nós tratamos apenas dos funcionários da empresa... até então, a nossa preocupação realmente seria apenas com os funcionários que precisavam acessar o sistema da empresa, ou seja, o Gerente e o Administrador como vemos no exemplo abaixo:
Dessa forma tínhamos Administrador e Gerente herdando da classe FuncionarioAutenticavel que por sua vez herdava da classe Funcionario...
Mas acontece que após definir que esses funcionários específicos precisam de acesso ao sistema, o Cliente também solicitou acesso ao sistema da empresa. O que ocorre então?
Bem... lembra que nós definimos que para acessar o sistema era necessário herdar da classe FuncionarioAutenticavel?
Se queremos que a classe Cliente também tenha cesso ao sistema, devemos fazer o mesmo que fizemos com as classes Administrador e Gerente, certo?
O problema é que se fazemos isso, nós comprometemos a nossa lógica de negócio... perceba como as nossas classes passam a ser organizadas após isso:
Dessa forma o Cliente tem acesso ao sistema, mas também ele passou a herdar da classe FuncionarioAutenticavel e consequentemente também herdou da classe Funcionario... ou seja, fizemos o nosso cliente ser tornar como um funcionário em nosso sistema, e isso é péssimo para nossa lógica de negócio.
Então como poderíamos corrigir esse problema, mas manter o cliente e os funcionários que precisam do acesso ao sistema normalmente?
Será que bastaria remover a herança da classe Funcionario? Afinal de contas, se a nossa classe que permite acesso ao sistema não herda da classe Funcionario poderíamos ter o cliente acessando o sistema sem maiores complicações, certo?
Na verdade, isso nos cria um novo problema... pois não podemos deixar as classes Gerente e Administrador sem a herança da classe Funcionario... mas também precisamos permitir o acesso ao sistema.
Então esbarramos com o último problema, não podemos ter herança múltipla no Java... ou seja, não podemos fazer com que a classe herde de mais de uma superclasse. Então a classe Gerente não poderá simplesmente herdar da classe Autenticavel e da classe Funcionario ao mesmo tempo. Isso ocorre por uma questão de segurança, pois possibilitar que a classe herde de várias superclasses nos traria vários problemas.
Com respeito ao uso do método autentica como abstrato, poderíamos realmente utilizar como sugeriu... utilizando o @Override nas subclasses (classes filhas) e reescrevendo o método para cada uma dessas classes. Mas inevitavelmente nós nos depararíamos com essa situação que o instrutor levantou... a herança não nos permite resolver esse problema por completo utilizando apenas classes e métodos abstratos.
A solução para isso é apresentada na próxima aula, onde temos nosso primeiro contato com interfaces, um recurso do Java que vai nos possibilitar resolver esse problema sem utilizar a herança, e permitirá ao cliente e aos funcionários acessarem o sistema, mas sem afetar a nossa lógica do negócio.
Consegui te ajudar com essa resposta? Se eu puder te ajudar em algo mais, é só falar! 😄