Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Abstract no método autentica

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?

1 resposta
solução!

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:

Na estrutura das classes temos a classe Funcionario, que tem como subclasses: FuncionarioAutenticavel e EditorDeVideo. A classe FuncionarioAutenticavel por sua vez, possui como subclasses: Administrador e Gerente. As classes que herdam de FncionarioAutenticavel podem acessar o sistema da empresa.

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:

Nesta imagem temos também a classe Cliente, que herda da classe FuncionarioAutenticavel. Além disso temos marcações em vermelho para destacar o que está acontecendo com a classe Cliente, que herda diretamente da classe FuncionarioAutenticavel e também da classe Funcionario. Ao fim da imagem temos a pergunta: Cliente é um tipo de Funcionario?

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.

A estrutura está um pouco diferente da imagem anterior, pois a classe FuncionarioAutenticavel agora se chama Autenticavel, e tentamos fazer com que a classe Gerente herde das classes Funcionario e Autenticavel ao mesmo tempo, o que não é possível. Ao fim da imagem temos a pergunta: Gerente herda de Funcionario mas também herda de Autenticavel?

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

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.Bons Estudos!