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

Vantagem de criar um objeto com referência genérica

Bom dia! Ficou claro pra mim a vantagem de se utilizar métodos com parâmetros genéricos (no caso das aulas o Funcionario, no método de registro de bonificações). Dessa forma o método será invocado dependendo do tipo de objeto criado, se Gerente, Editor de Vídeo etc.

Mas não consegui enxergar vantagem na implementação abaixo: Funcionario f = new Gerente();

Se eu quero criar um objeto do tipo Gerente, porque eu deveria utilizar uma referência genérica? Porque nesse caso acima não consigo implementar os métodos específicos da classe Gerente, correto? Se estou criando um objeto do tipo Gerente não é mais vantajoso sempre utilizar

Gerente g = new Gerente();

Fica a dúvida!

7 respostas

Bom dia! O que acontece é que fica mais fácil a manutenção mais para frente no seu código. Se você usar List e dar um new em um ArrayList, e por acaso não for viável, você pode mudar somente o ArrayList para LinkedList, por exemplo que vai continuar sendo tipo list. Porque a ideia é ser a referencia mais genérica sempre para na sua classe especifica sobrescrever o método. E sim você pode usar os métodos de Classe Funcionário que não tem problema quando instanciado um new Gerente();

Não entendi muito bem sua explicação. Continuei com a dúvida por exemplo de implementação dos métodos do Gerente sendo que o criei como referência a Funcionário. Mesmo que o crie como new Gerente(), os métodos podem ser sobrescritos da mesma forma. Não preciso instanciar como referência mais genérica porque mesmo com a mais específica pode haver sobrescrita.

Não estou falando de sobrescrita.... Eu disse que você pode usar tanto os metodos de funcionário como os métodos de gerente desta forma...

Funcionario f = new Gerente();


//Agora olha desta maneira...
List<Movimentacao> movimentos = new ArrayList<>();

Eu tenho uma List, interface, do tipo ArrayList, porém por questão de performace eu precisaria que ela fosse uma LinkedList eu somente altero o tipo que irá funcionar. Vou continuar sobreescrevendo os métodos de List e também usar os métodos de LinkedList. Ficando mais fácil a manutenção no código, tendo referencias mais genéricas

List<Movimentacao> movimentos = new LinkedList<>();
solução!

Eduardo, acredito que a resposta ficou confusa pro Rafael porque ele está no curso 3, e o Nico só fala de ArrayList lá na parte 6.

Rafael, lembre-se sempre que todo gerente é um funcionário, mas nem todo funcionário é um gerente.

Com isso em mente, imagine ter que implementar todos os métodos e atributos de funcionários também no gerente. Isso resultaria em código duplicado, o que não é uma boa prática.

Se todo funcionário tem nome, idade, CPF, número de registro e salário, por que você deveria criar essas mesmas implementações também no gerente?

Construindo sua aplicação com referências mais genéricas, você pode deixar todas essas características gerais dentro de Funcionário, e aplicar em Gerente somente o que for de acordo com ele, como o exemplo usado no curso: a bonificação.

Criando um Funcionario f = new Gerente();, você cria um gerente com suas características únicas e ainda toma proveito das características gerais (genéricas) vindas da classe Funcionario. Tudo isso sem repetir código. Dessa maneira você escreve seu código de acordo com as boas práticas e mantém tudo limpo e enxuto.

Espero que tenha ajudado. Bons estudos!

Marquei como resolvida mas na realidade acho que não me expressei corretamente. Digamos que eu tenha a super classe Funcionario e duas classes filhas (Gerente e Analista). Quero que a classe Gerente tenha um método próprio autentica(). Se eu usar a instanciação Funcionario gerente = new Gerente(); eu não consigo acessar o método autentica entendeu? E mesmo que eu utilizasse esse método na classe Funcionario como sendo abstrato, me obrigaria a implementá-lo na classe Analista, o que eu não gostaria. Não sei se fui claro mas a dúvida ainda persiste. Valeu!

Estou com a mesma dúvida do colega Rafael. Não vi vantagem em declarar:

Funcionario f = new Gerente();

Para mim, se eu declarar:

Gerente f = new Gerente();

Terei acesso às características de ambos.

O colega Rodrigo disse que "Criando um Funcionario f = new Gerente();, você cria um gerente com suas características únicas e ainda toma proveito das características gerais (genéricas) vindas da classe Funcionario. Tudo isso sem repetir código. Dessa maneira você escreve seu código de acordo com as boas práticas e mantém tudo limpo e enxuto."

Porém, entendo que

Gerente f = new Gerente();

O resultado final seria o mesmo (sei que não é, mas não ficou claro neste vídeo o que tem de diferente, ou um porquê para isso). O ponto pode ser ajustado futuramente, acho.

RAFAEL LANGONI NAVES:

"não consegui enxergar vantagem na implementação abaixo: Funcionario f = new Gerente();"

GUILHERME DE SOUZA BARROS:

"Não vi vantagem em declarar: Funcionario f = new Gerente();"

Realmente não há vantagem, colegas Rafael e Guilherme, e o Nico explicará nos próximos tópicos o porquê:

A instanciação Funcionario f = new Gerente(), ou Funcionario f = new Administrador(), etc., ainda que funcione, não faz sentido. Esse formato foi usado apenas como exemplo de referenciação de objetos e o próprio Nico dirá, nas próximas aulas, que esse tipo de instanciação não é utilizada.

Inclusive, a classe Funcionário se tornará abstrata, como vocês irão ver nas próximas aulas.

A vantagem desta modelagem é o reuso de código já escrito na classe Funcionário (atributos e métodos comuns a todos os filhos).

Espero ter ajudado.