none
Generics RRS feed

  • Pergunta

  • Alguém conseguiria explicar de forma bem idiota pra v se eu finalmente consigo entendo a aplicabilidade e funcionamento de um GENERICS ?

    não consigo entender esse troço!

    e qual a relação dele com herança ?

    abçs

    SerraVentura
    segunda-feira, 29 de novembro de 2010 20:14

Respostas

  • SerraVentura,

    Você usa generics para criar um tipo especial que recebe como parâmetro um outro tipo, geralmente para evitar problemas de conversão de tipos. O que se diz é que o uma classe generic é fortemente tipada pois ela só trabalha com dados do tipo especifico.

    É meio complicado de explicar, mas por exemplo.

    A classe ArrayList é uma lista que recebe qualquer objeto do tipo object, então o ArrayList não é tipado, ou seja, o compilador não tem como garantir que dentro deste ArrayList só irá conter objetos do tipo string, por exemplo.

    Se você quiser uma lista fortemente tipada do tipo string, você usaria o tipo List Generic, usando como List<string> assim o compilador garante que esta lista só pode receber objetos do tipo string.

    Basicamente ele server para isto.

    Mais:

    http://msdn.microsoft.com/pt-br/library/0x6a29h6(VS.90).aspx

    Quanto a herança, você pode criar uma classe fortemente tipada herdando de um tipo generic, por exempo:

    public class StringList: List<string>
    {
    }

    Ou você pode estender uma classe genéric utilizando os argumentos genéricos, tipo:

    public class MyGenericList<T>: List<T>
    {
     public void Show(T item)
     {
      MessageBox.Show(item.ToString());
     }
    }

    at.,


    Rogério de Resende Ohashi | Ohashi.NET (.NET, Security, C#, WinForms, WCF, Workflow, Azure, Windows Phone, Mono)
    segunda-feira, 29 de novembro de 2010 20:23
    Moderador
  • Não sei se consigo explicar isso de forma idiota srsrs mas vamos lá!

    imagine o cenário onde precisamos criar uma interface que contenha diversos métodos para utilização na camada de acesso a dados

    veja abaixo:

    public interface IBusiness<T, ID>
     {
      IList<T> GetObjectCollection();
      void SaveT(T pObject);
      T GetObjectById(ID pObjectId);
      bool SaveAll(IList<T> pListofObject);
      bool DeleteObject(T pItem);
     }
    

    Caso não existisse o Generic, essa interface deveria trabalhar com object o que iria fazer com que você precisasse efetuar diversos casts em tempo de execução. MAU!!!!

    Mas, com o Generic conseguimos efetuar uma codificação TOTALMENTE tipada, resolvendo o problema de cast

    public class UserBusiness : IBusiness<User,int>
    {
    
     .......
    }
    

    Isso permite que você aos poucos vá criando uma arquitetura mais limpa, como por exemplo, criando uma Business genérica e etc.

    De forma simples é isso.

    Para que você tenha uma noção do quanto esse recurso é utilizado, analise como todos os tipos de List<T> utilizam generics, onde é VOCÊ quem define o tipo a ser trabalhado, porém, a implementação é voltada para qualquer tipo de objeto.

    Bom, é isso.

    O certo mesmo é você estudar mais sobre Design Patterns, Refactoring e etc, ai vc irá entender na prática como e quando utilizar, não adianta nada eu colocar um exemplo enorme aqui. tentei ser bem simples

    espero ter ajudado! ate mais


    Tornar o simples complicado é facil, tornar o complicado simples é criatividade, vontade e conhecimento
    segunda-feira, 29 de novembro de 2010 20:33

Todas as Respostas

  • SerraVentura,

    Você usa generics para criar um tipo especial que recebe como parâmetro um outro tipo, geralmente para evitar problemas de conversão de tipos. O que se diz é que o uma classe generic é fortemente tipada pois ela só trabalha com dados do tipo especifico.

    É meio complicado de explicar, mas por exemplo.

    A classe ArrayList é uma lista que recebe qualquer objeto do tipo object, então o ArrayList não é tipado, ou seja, o compilador não tem como garantir que dentro deste ArrayList só irá conter objetos do tipo string, por exemplo.

    Se você quiser uma lista fortemente tipada do tipo string, você usaria o tipo List Generic, usando como List<string> assim o compilador garante que esta lista só pode receber objetos do tipo string.

    Basicamente ele server para isto.

    Mais:

    http://msdn.microsoft.com/pt-br/library/0x6a29h6(VS.90).aspx

    Quanto a herança, você pode criar uma classe fortemente tipada herdando de um tipo generic, por exempo:

    public class StringList: List<string>
    {
    }

    Ou você pode estender uma classe genéric utilizando os argumentos genéricos, tipo:

    public class MyGenericList<T>: List<T>
    {
     public void Show(T item)
     {
      MessageBox.Show(item.ToString());
     }
    }

    at.,


    Rogério de Resende Ohashi | Ohashi.NET (.NET, Security, C#, WinForms, WCF, Workflow, Azure, Windows Phone, Mono)
    segunda-feira, 29 de novembro de 2010 20:23
    Moderador
  • Não sei se consigo explicar isso de forma idiota srsrs mas vamos lá!

    imagine o cenário onde precisamos criar uma interface que contenha diversos métodos para utilização na camada de acesso a dados

    veja abaixo:

    public interface IBusiness<T, ID>
     {
      IList<T> GetObjectCollection();
      void SaveT(T pObject);
      T GetObjectById(ID pObjectId);
      bool SaveAll(IList<T> pListofObject);
      bool DeleteObject(T pItem);
     }
    

    Caso não existisse o Generic, essa interface deveria trabalhar com object o que iria fazer com que você precisasse efetuar diversos casts em tempo de execução. MAU!!!!

    Mas, com o Generic conseguimos efetuar uma codificação TOTALMENTE tipada, resolvendo o problema de cast

    public class UserBusiness : IBusiness<User,int>
    {
    
     .......
    }
    

    Isso permite que você aos poucos vá criando uma arquitetura mais limpa, como por exemplo, criando uma Business genérica e etc.

    De forma simples é isso.

    Para que você tenha uma noção do quanto esse recurso é utilizado, analise como todos os tipos de List<T> utilizam generics, onde é VOCÊ quem define o tipo a ser trabalhado, porém, a implementação é voltada para qualquer tipo de objeto.

    Bom, é isso.

    O certo mesmo é você estudar mais sobre Design Patterns, Refactoring e etc, ai vc irá entender na prática como e quando utilizar, não adianta nada eu colocar um exemplo enorme aqui. tentei ser bem simples

    espero ter ajudado! ate mais


    Tornar o simples complicado é facil, tornar o complicado simples é criatividade, vontade e conhecimento
    segunda-feira, 29 de novembro de 2010 20:33
  • vlw galera pela ajuda, mas acho q tenho q estudar um pouco mais mesmo rs...

    indica algum bom livro de  Design Patterns ?

     

    vlw abcs


    SerraVentura
    terça-feira, 30 de novembro de 2010 12:39
  • Primeiro de tudo: Refatoração - Martin Fowler

    Depois: Use a Cabeça, Design Patterns

    Esses dois você que esta começando precisa ter, depois, ai a coisa começa a ficar mais específica!

    Boa sorte e bons estudos!


    Tornar o simples complicado é facil, tornar o complicado simples é criatividade, vontade e conhecimento
    terça-feira, 30 de novembro de 2010 12:43