Polimorfismo: O que é de fato e como utilizá-lo

Quando iniciei meus estudos em Orientação a Objetos há anos atrás, tive muita dificuldade em entender de fato do que se tratava o Polimorfismo em orientação a objetos. Li em livros que encontrei explicações do tipo ‘objeto que assume várias formas’, explicações que na prática não ajudavam em absolutamente nada, não explicavam o conceito real nem como utilizar esta importante característica da orientação a objetos. Na minha busca encontrava definições abstratas e que não levavam o leitor a conclusão alguma.

Depois de uma caminhada tortuosa, aprendi que não existem objetos polimórficos, mas sim referências polimórficas. Não existem objetos que tomam várias formas, pelo menos não em nossos sistemas TI.

No desenvolvimento de sistemas, podemos utilizar o conceito de polimorfismo através de uma forma popular, incluindo operações polimórficas em classes diferentes, herdadas de uma mesma superclasse. Por exemplo, podemos implementar subclasses de uma superclasse Impressora que utilizam maneiras diferentes de realizar a impressão.

Permitindo existir um mesmo nome de método para subclasses diferentes de uma mesma superclasse, esta característica nos permite utilizar uma mesma chamada de método, a partir de uma referência polimórfica em tempo de execução, para obter resultados diferentes simplesmente apontando para as sub-classes diferentes em tempo de execução, chamando a mesma mensagem.

Deste modo, o polimorfismo nos permite definir em tempo de execução qual objeto desejamos/precisamos utilizar.

Imagine um sistema com perfis de acesso, que precisa mostrar o menu de opções do mesmo de acordo com o perfil do usuário.

Neste cenário, cada tipo de usuário terá opções diferentes, dependendo de seu perfil de acesso, considerando as funcionalidades que ele está apto a executar no sistema.

Como profissionais desejamos implementar um sistema onde no login, o sistema verifica o perfil do usuário e retorna para a interface o menu adequado ao usuário logado.

Mas como fazer isto?

Podemos utilizar o polimorfismo fazendo o sistema carregar o menu após o login do usuário, referenciando o  mesmo em tempo de execução através de uma referência polimórfica.

Neste cenário, poderíamos imaginar como exemplo dois tipos de usuário, cliente e administrador, cada um com seu próprio perfil de acesso e suas funcionalidades próprias, podendo ter outras em comum.

Para implementar este exemplo, podemos criar a superclasse Menu e duas subclasses dela, a Menucliente e a MenuAdministrador todas com o método getMenu() em comum.

Veja o diagrama de classes exemplo abaixo associado ao exemplo apresentado neste artigo, relacionado a um sistema de gestão de chamados.

Nesta modelagem, todos os usuários possuem a opção de alterar dados cadastrais, visualizar mapa do site e de sair do sistema, executando logoff do mesmo, todas implementadas na superclasse. Por outro lado, existem opções restritas ao perfil do usuário, implementadas nas subclasses.

No desenvolvimento de nosso sistema, criaríamos também uma instância de uma classe Usuario contendo um método também chamado getMenu(), que quando chamado instanciaria um objeto stateless da classe Menu, retornando o menu de acordo com o perfil do usuário após o mesmo ter realizado login no sistema.

Como exemplo, em nossa aplicação teríamos a criação da referência polimórfica menuPolimorfico como:

Menu menuPolimorfico = null;

Em nosso exemplo, esta referência polimórfica seria utilizada pelo sistema para apresentar o menu ao usuário e receberia o menu adequado ao perfil do usuário logado, através da chamada do método  usuario.getMenu() que encapsula a criação e o retorno do menu. Veja fragmento de código abaixo.

Menu menuPolimorfico = null;

//……………………………….

menuPolimorfico = usuario.getMenu();

Luck favors the prepared mind!

Para saber mais, leia o livro Engenharia de Software na Prática: Editora Novatec, 2010. ISBN 978-85-7522-217-1


2 Comentários

Hélio Engholm Jr
2

Paulo, tudo bem?
O método getMenu() deve retornar as opções do usuário para apresentá-las no browser.
O código por mim implementado utiliza polimorfismo para utilizar o objeto subclasse de Menu apropriado, para montar e retornar o menu correto ao usuário após o login através do método getMenu(). Este método existe tanto na superClasse, como nas subClasses. Veja o código exemplo, a paritr da pg 134 do livro.
Boa sorte e bem vindo ao mundo Java, que assim como o mundo .NET pode te dar um futuro brilhante.
Abs,
HEngholmJr

Deixe seu comentário

Seu endereço de e-mail não será publicado. Campos com * são obrigatórios!