C# – Generics

20 09 2008

Postarei uma sequência de pequenos artigos explicando funcionalidades da linguagem C#, conforme vou aprendendo vou postando aqui. Vou começar falando sobre Generics.

Generics é um recurso múito interessante disponivel em algumas linguagens (Ada, Eiffel, Java, Haskell, C#, Visual Basic .NET, em C++ são conhecidos como Templates).

Problema: Você precisa implementar uma lista que aceite apenas um tipo específico de dados como por exemplo um struct (ou uma classe) representando um cliente ou um fornecedor.

Solução obvia: Criar uma classe descendente de System.Collections.List sobrescrevendo o método Add para aceitar o tipo desejado.

Problema dessa solução: Para cada tipo de dado diferente seria necessário implementar uma classe diferente.

Solução prática: Utilizar Generics! vamos a um exemplo bem simples.

Primeiro declaramos as estruturas de cliente e fornecedor para o exemplo:

struct Cliente
{
  string Nome;
  int Idade;
  public Cliente(string aNome, int aIdade)
  {
    Nome  = aNome;
    Idade = aIdade;
  }
}

struct Fornecedor
{
  string Nome;
  string RegiaoVenda;
  public Fornecedor(string aNome, string aRegVenda)
  {
    Nome = aNome;
    RegiaoVenda = aRegVenda;
  }
}

Agora criaremos uma classe com um método de exemplo, esse método consiste em adicionar um cliente em uma lista:

class TesteGeneric
{
  List<Cliente> lc = new List<Cliente>();
  public TesteGeneric()
  {
    Cliente c = new Cliente("Cliente01", 20);
    lc.Add(f);
  }
}

Note na linha: List<Cliente> lc = new List<Cliente>(); estamos criando um objeto do tipo List mas que aceitará apenas dados do tipo Cliente, não precisamos criar nenhuma classe nova herdando de List e sobrescrever seus métodos.

para completar criaremos nossa classe principal que irá utilizar a classe criada anteriormente

public class inicial
{
  static void Main()
  {
    TesteGeneric tg = new TesteGeneric();
    foreach (Cliente c in tg.lc)
    Console.WriteLine(c.Nome);
  }
}

Compile e veja que nenhuma falha é mostrada, agora para testarmos se o recurso funciona mesmo, vamos tentar adicionar um fornecedor na lista, substitua a linha Cliente c = new Cliente(“Cliente01″, 20);

pela linha

Fornecedor c = new Fornecedor(“Fornecedor01″,”Norte do Paraná”);

Compile e verá que é exibido um erro parecido com esse:

Argument `#1′ cannot convert `Exemplos.Fornecedor’ expression to type `Exemplos.Cliente’

isso acontece pois nossa lista só aceita clientes.

Espero que tenha esclarecido o conceito mais básico ou pelo menos que eu tenha incitado sua curiosidade em descobrir o poder dos Generics.

Segue código fonte completo:

using System;
using System.Collections;
using System.Collections.Generic;
namespace Exemplos
{
  struct Cliente
  {
    public string Nome;
    public int Idade;
    public Cliente(string aNome, int aIdade)
    {
      Nome = aNome;
      Idade = aIdade;
    }
  }

  struct Fornecedor
  {
    public string Nome;
    public string RegiaoVenda;
    public Fornecedor(string aNome, string aRegVenda)
    {
      Nome = aNome;
      RegiaoVenda = aRegVenda;
    }
  }

  class TesteGeneric
  {
    public List lc = new List();
    public TesteGeneric()
    {
      Cliente c = new Cliente("Cliente01", 20);
      lc.Add(c);
    }
  }

  public class inicial
  {
    static void Main()
    {
      TesteGeneric tg = new TesteGeneric();
      foreach (Cliente c in tg.lc)
      Console.WriteLine(c.Nome);
    }
  }
}

Ações

Informações

2 respostas

24 09 2008
medeiros

gostei…

8 10 2008
mono + Linq « Renato Ap. Françoso

[...] declaramos uma lista de pessoas utilizando Generics (caso tenha alguma dificuldade com generics, veja estes exemplos e também criamos um métodos que preenche nossa lista com dados fictícios e o método principal [...]

Deixe um comentário