Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Duplicação de código com a interface.

O professor nico disse no Primeiro vídeo da aula 06 que duplicar código não é uma boa ideia, por isso criamos a classe abstrata intermediária, porém no quarto vídeo ao criarmos a interface temos que implementar e portanto reescrever novamente os métodos da interface em todas as classes que utilizam, repetindo ainda mais os códigos.

Gostaria de saber se existe alguma forma de contornar isto.

4 respostas

Boa noite Renan!

Realmente duplicar código não é uma boa prática, mas, nesse caso específico que você citou, não tem outro jeito.

Administrador e Gerente são Funcionarios, e sao Autenticaveis; Cliente não é Funcionario, mas é Autenticavel.

Se você criar uma Classe Autenticavel, ao invés de uma Interface, não vai ser possível prosseguir, pois as Classes Administrador e Gerente já herdam de Funcionario,e não podem herdar de outra classe, diretamente. Portanto, a única solução é utilizar a Interface Autenticavel e duplicar o código. Só não vai ter código duplicado se a implementação de autenticação for diferente para as 3 Classes (Administrador, Gerente e Cliente); aí você vai ter um método diferente para cada Classe, mas ele precisa existir (pois a Classe assinou o contrato da Interface) e precisa ter a mesma assinatura (mesmo nome e mesmos parâmetros).

solução!

Java não permite herança múltipla(herdar de mais de uma classe), e no modelo proposto pelo exercício já temos herança de Gerente , Adminstrador para Funcionario. Que por sinal é um uso que faz sentido , porque temos a relação " é um" das classes filhas para a classe pai (Gerente e Adminstrador "é um" Funcionario)

Vamos supor que os métodos setSenha e autentica foram definidos na classe abstrata Funcionario . E que agora o sistema modele uma classe para visitantes que possam frequentar a empresa(classe VISITANTE) e que eles precisam ser autenticados.

Muito fácil que o visitante seja autenticado , basta que essa classe herde de Funcionario , e o código será reaproveitado(ou sobrescrito), mas acabamos de criar outro problema VISITANTE é um FUNCIONARIO?

NÃO! eles apenas necessitam de COMPORTAMENTOS para autenticação, por isso foi criado a interface AUTENTICAVEL, para que toda classe que precise ser autenticável possar ser implementando a interface.

Mas se a lógica de autenticação se repetir muito, você pode encapsular em uma classe , e sair reaproveitando.

Esses cursos abordam esse assunto de design de código e podem te dar uma maior compreensão sobre essas questẽos.

https://cursos.alura.com.br/course/orientacao-objetos-java

https://cursos.alura.com.br/course/orientacao-a-objetos-avancada-e-principios-solid

Agora consegui entender melhor esta questão, muito obrigado, pessoal!

Por nada Renan! É sempre bom poder ajudar!