C#
- Polimorfismo (revisitado)
![]() |
Hoje vou apresentar uma revisão sobre o conceito de polimorfismo na linguagem C#. |
Polimorfismo é a capacidade das classes de fornecer diferentes implementações de métodos que são chamados pelo mesmo nome.
Você já entende e usa o polimorfismo no seu dia a dia quando determina qual
situação ou objeto está sendo usado com um verbo para determinar o comportamento
verdadeiro do verbo.
Assim, por si só o significado do verbo 'dirigir' é bem vago. (Dirigir o que ?)
Dirigir um carro é diferente de dirigir um barco ou de dirigir uma empresa ou ainda de dirigir-se a um local, etc.
Somente quando você coloca o verbo 'dirigir' no contexto você sabe qual o comportamento ou atividade esta associado a ele.
Da mesma
forma, na linguagem C#, você já usou ou experimentou o
polimorfismo diversas vezes. Não acredita ???
Vejamos um exemplo simples e rápido: o método ToString().
Este método é um dos quatro métodos da classe Object, e, isso significa que todas as classes da plataforma .NET, bem como as classes definidas pelo usuário, possuem o método ToString().
E como funciona e para que serve o método ToString() ?
Com base no tipo de objeto que chama o método ToString(), ele executa uma função. O resultado final é converter algum objeto em sua representação de string.
Assim , você pode pensar no método ToString() como tendo um número de diferentes implementações, e a implementação é determinada pelo tipo de objeto que chama ToString().
Isso é
polimorfismo.
Exemplo:
Abaixo temos a classe Pessoa com 3 propriedades onde estamos sobrescrevendo o método ToString() para retornar o nome e sobrenome.
![]() |
![]() |
No código
acima a primeira chamada para o método ToString()
chama o método definido na classe Pessoa. Este
método sobrescreve o método ToString() da classe
Object e concatena o nome com o sobrenome.
A CLR reconheceu que deveria usar este método porque foi chamado a partir de um
objeto aluno :
aluno.ToString();
A
segunda chamada para o método ToString() não usa a
implementação definida na classe Pessoa.
Observe que essa chamada é feita com um objeto int.
A propriedade Idade retorna um
int. Assim, com base no objeto que faz a chamada, o
método ToString() da classe
Object é chamado.
O polimorfismo permite que um método de uma classe seja chamado sem levar em
consideração a sua implementação.
Assim, na plataforma .NET, o polimorfismo é implementado através de interfaces, herança e de classes abstratas.
Polimorfismo com interface
Sabemos
que várias classes podem implementar a mesma interface
ou implementar mais de uma interface. A interface descreve os métodos e os tipos
de parâmetros que cada membro do método precisa receber e retornar, mas deixa os
detalhes do corpo do método para as classes que implementam a interface definir.
Assim, cada classe que implementa a interface pode ter um comportamento
completamente diferente. O nome do método é o mesmo em todas as classes que
implementam a interface, mas a
funcionalidade pode ser muito diferente de uma classe para outra.
Polimorfismo com herança
Através
da herança, o polimorfismo é possivel ao permitir
que as classes sobrescrevam os membros da classe base.
Isso possibilita a vinculação dinâmica. O CLR determina qual método deve chamar
em tempo de execução com base em qual objeto chama o método. Ao marcar o método
com a palavra-chave virtual permitimos que as
classes derivadas escrevam sua própria funcionalidade para o método.
Polimorfismo com classe abstrata
Como uma
classe abstrata não pode ser instanciada, os
recursos das interfaces e da herança entram em jogo com a programação
polimórfica.
Através do uso de classes abstratas, as classes que derivam destas são forçadas
a incluir os detalhes de implementação para qualquer método abstrato.
Ao contrário das interfaces, que simplesmente fornecem a assinatura para os
métodos que devem ser implementados, alguns ou todos os membros de uma classe
abstrata podem ser implementados.
As classes abstratas também podem incluir membros de dados, propriedades, eventos e métodos. Os métodos podem ser marcados como virtuais ou como abstratos, ou ser completamente implementado. A determinação de qual método usar é baseado no objeto que faz a chamada.
"Porque Deus não nos deu o espírito de temor, mas
de fortaleza, e de amor, e de moderação."
2 Timóteo 1:7
Referências:
C# - Testando cada elemento em um Array ou List<T>
.NET - Inversão de Controle (IoC) e Injenção de ... - Macoratti.net
OOP - Herança x Composição- OOP - O princípio da substituição de Liskov (LSP)
Padrões de Projeto - Os 7 princípios básicos do desenvolvimento de software