C# - Usando Generics na prática - II


  Hoje veremos como usar Generics na prática em um projeto para criar uma calculadora Genérica.

Continuando a primeira parte deste artigo veremos uma abordagem mais robusta para implementar uma calculadora genérica usando Generics.

Nesta abordagem vamos usar uma classe abstrata Calculadora<T> que será especializada para cada tipo primitivo, e, o tipo genérico poderá então usar uma instância da calculadora apropriada para realizar as operações.

Em um projeto do tipo Console criado no VS 2017 Community vamos criar uma classe abstrata chamada Calculadora<T> com 4 métodos abstratos conforme abaixo:

A seguir vamos especializar o tipo para o qual desejamos criar a calculadora criando uma classe chamada CalculadoraInteiros que herda da classe Calculadora<T>, define o tipo como int e sobrescreve os métodos abstratos implementando as operações :

A seguir vamos criar uma classe que usa a implementação da CalculadoraInteiros e realiza as operações.

Vamos criar a classe CalcularOperacoes() que implementa as operações para uma lista de números com o código abaixo:

  1. using System.Collections.Generic;
  2. public class CalcularOperacoes<T> where T : new()
  3. {
  4.      Calculadora<T> calculadora;
  5.      public CalcularOperacoes(Calculadora<T> _calculadora)
  6.      {
  7.         this.calculadora = _calculadora;
  8.      } 
  9.      public T Somar(List<T> items)
  10.      {
  11.         T soma = new T();
  12.         for (int i = 0; i < items.Count; i++)
  13.         {
  14.             soma = calculadora.Adicionar(soma, items[i]);
  15.         }
  16.         return soma;
  17.      }
  18.  
  19.      public T Subtrair(List<T> items)
  20.      {
  21.         dynamic subtrair = new T();
  22.         for (int i = 0; i < items.Count; i++)
  23.         {
  24.             if(i==0)
  25.             {
  26.                 subtrair = calculadora.Subtrair(subtrair, items[i]);
  27.                 subtrair = subtrair * -1;
  28.              }
  29.              else
  30.              {
  31.                 subtrair = calculadora.Subtrair(subtrair, items[i]);
  32.              }
  33.         }
  34.         return subtrair;
  35.      }
  36.      public T Multiplicar(List<T> items)
  37.      {
  38.         dynamic multiplicar= 1;
  39.         for (int i = 0; i < items.Count; i++)
  40.         {
  41.             multiplicar= calculadora.Multiplicar(multiplicar, items[i]);
  42.         }
  43.         return multiplicar;
  44.      }
  45.      public T Dividir(List<T> items)
  46.      {
  47.         dynamic dividir= 1;
  48.         for (int i = 0; i < items.Count; i++)
  49.         {
  50.             if(dividir==1)
  51.             {
  52.                dividir= calculadora.Dividir(items[i], dividir);
  53.             }
  54.             else
  55.             {
  56.                dividir= calculadora.Dividir(dividir, items[i]);
  57.             } 
  58.         }
  59.         return dividir;
  60.      }
  61. }  
     

Neste código, continuamos a usar o tipo dynamic para as operações de subtração, multiplicação e divisão.

A seguir temos o código no método Main() que mostra a utilização da nossa implementação.

O resultado obtido para os números 9,3 e -1 exibido abaixo:

Nossa calculadora Genérica, na implementação para inteiros, esta funcionando, mas podemos melhorar ainda mais o código, pois continuamos a usar dynamics o que afeta o desempenho da aplicação.

Vou deixar um link para uma implementação que não usa nenhuma invocação de método virtual : https://goo.gl/rZt91p

Pegue o projeto aqui :  CalcGenerica.zip

"E (Jesus) dizia: Por isso eu vos disse que ninguém pode vir a mim, se por meu Pai não lhe for concedido."
João 6:65

Referências:


José Carlos Macoratti