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! 😄