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:


José Carlos Macoratti