LINQ - Conceitos e fundamentos - Métodos de extensão


   O que são os Métodos de Extensão (Extension Methods) ?

  Os métodos de extensão permitem ampliar a funcionalidade já existente em uma classe ou tipo.

Uma das funcionalidades implementadas  a partir da versão 3.5 da plataforma .NET são os métodos de extensão;

Para dar suporte ao LINQ foi necessário adicionar novos métodos em classes/tipos já existentes sem usar o recurso da herança ou ter que recompilar a classe/tipo original.

Isso foi necessário pois muitas classes/tipos não permitiam a modificação por meio da herança e além disso teriam que continuar compatíveis com as versões anteriores.

Sem utilizar os métodos de extensão quais as opções que temos para incluir novas funcionalidades em classes e interfaces ?

Vejamos:

  1. Acessar o código fonte e incluir a funcionalidade diretamente. Muito bem , só que teríamos que ter acesso ao código fonte , e, isso quase sempre não é possível;
  2. Usando herança para herdar a nova funcionalidade , mas muitas classes não dão suporte a herança;
  3. Criar novamente a funcionalidade desde o princípio o que seria trabalhoso , complexo e demorado;

Mesmo optando por usar um dos métodos acima, se fosse viável é claro, teríamos que nos preocupar em manter a compatibilidade com as versões anteriores tornando o processo complexo e trabalhoso.

Uma solução elegante para resolver estes problemas e conseguir o objetivo almejado foi implementar os métodos de extensão que fornecem um mecanismo para estender as classes/tipos já existentes, mesmo quando a classe/tipo não da suporte a herança, com novos métodos que podem ser usados como métodos normais de instância.

Nota: Os métodos de extensão são uma característica específica da plataforma .NET e não tem correspondência nos conceitos de orientação a objeto padrão.

Veja por exemplo a classe System.String ; ela não dá suporte a herança e não podia ser alterada ou estendida. Eu disse não podia, pois na versão 3.5 do .NET Framework podemos alterá-la usando os métodos de extensão.

Vamos supor, apenas a título de demonstração, que você deseja estender a classe System.String usando o recurso dos métodos de extensão, incluindo uma nova função chamada FirstCharUpper() (belo nome !!!) que tem o objetivo de converter o primeiro caractere de uma string em caixa alta; assim, macoratti seria convertido para Macoratti.

O código necessário para realizar tal tarefa é muito simples e consiste de uma única linha de código:

StrConv(STRING, VbStrConv.ProperCase)

Como podemos implementar este recurso como um método de extensão ???

Na linguagem Visual Basic para implementar os métodos de extensão você tem que seguir algumas regras :

A restrição de somente poder usar o recurso em módulos deve-se ao fato de os módulos não poderem participar de cadeias herdadas e de não existirem como módulos parciais simplificando assim o processo.

A título de exemplo abra o Visual Basic 2008 Express Edition e crie um novo projeto do tipo Windows Forms Application com um nome sugestivo qualquer;

Inclua um módulo ao seu projeto via opção Project -> Add Module e informe o nome MetodosExtensao.vb;

A seguir inclua o código abaixo no  módulo criado;

No código acima temos que :

- Estamos usando o namespace System.RuntimeCompileServices ;

- A função FirstCharUpper() que definimos possui o atributo <Extension()>;

- O primeiro parâmetro do tipo deve ser o tipo que estamos estendendo , no caso a classe System.String; (Não podemos usar Optional nem ParamArray)

Agora abra o editor de código para o formulário form1.vb e defina os namespaces e o código conforme a figura a seguir:

Perceba que o a digitar o ponto após a string s , o intellisense exibe os métodos de extensão com uma seta azul para baixo que indica que o método não faz parte da classe mas foi agregado a mesma. (Não devemos usar o recurso para substituir os métodos de instância existentes na classe original)

Podemos então concluir que os métodos de extensão são uma forma elegante de resolver o problema de incluir novas funcionalidades que dão suporte ao LINQ e que podem ser usadas com cautela e bom senso.

Conselho : Use , se preciso , mas não abuse.

Até o próximo artigo...

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti