.NET

19 nov, 2008

C# – Classes internas

Publicidade

Da mesma forma que em Java, em C# também podemos trabalhar com inner class ou classes internas.

Você deve estar se perguntando qual seria a utilidade disto.

Podemos pensar em alguns cenários onde talvez precisamos definir uma coleção de variáveis; ou funções e eventos a serem definidos e chamados usando um nome único (o nome da classe).

As classes internas são úteis por sua relação íntima com a classe externa. Dessa forma, se você precisa de um objeto que será usado apenas pela classe que você está escrevendo e por mais nenhuma outra, você não precisa escrever uma nova classe dentro do projeto, basta tornar este código uma classe interna.

Isso faz com que a classe interna tenha acesso a todas as variáveis e métodos (inclusive os privados) da classe que a contém, ou seja, a classe externa.

Abra o Visual C# Express Edition e crie um novo projeto do tipo Console Application com o nome InnerClass;

A seguir um exemplo de utilização de classe interna onde temos:

  • uma classe abstrata Admin que define dois métodos : getDetalhes() e mostraDetalhes();
  • uma classe Aluno que trata a informação básica : codigo e nome;
  • as classe definidas dentro da classe Aluno :

– a estrutura interna Exame que armazena detalhes de exames;

– a classe interna Faculdade que estende a classe abstrata admin;

//classe abstrata admin

abstract class Admin

{

abstract public void getDetalhes(string x,string y);

abstract public void mostraDetalhes();

}

 

//classe Aluno ( a classe externa)

class Aluno

{

   public string codigo;

    public string nome;

 

   //construtor da classe Alunos

   public Aluno()

   {

      codigo = " ";

      nome = " ";

   }

 

    public void getDados(string str1, string str2)

    {

     codigo = str1;

      nome = str2;

    }

 

    public void Exibir()

    {

      Console.WriteLine("Aluno Codigo {0} ", codigo);

      Console.WriteLine("Aluno Nome {0} ", nome);

    }

 

   //Declara a estrutura interna para armazenar detalhes dos exames

  public struct Exame

    {

      public string codigoExame;

      public string nomeExame;

 

     public void setDetalhes(string str1, string str2)

      {

           codigoExame = str1;

           nomeExame = str2;

      }

 

     public string[] getDetalhes()

      {

        string[] temp;

          temp = new string[2];

          temp[0] = codigoExame;

         temp[1] = nomeExame;

        return temp;

       }

    }//estrutura interna exame

 

  //Declara uma classe interna faculdade que estende a classe Admin

    public class Faculdade : Admin

     {

        public string fcodigo;

        public string fnome;

 

     public faculdade()

      {

        fcodigo = " ";

        fnome = " ";

      }

    
     //implementa o m,todo getDetalhes

   public override void getDetalhes(string str1, string str2)

      {

        fcodigo = str1;

         fnome = str2;

       }

     //implementa o m,todo mostraDetalhes

   public override void mostraDetalhes()

      {

        Console.WriteLine("\nFaculdade Codigo {0} ", fcodigo);

        Console.WriteLine("Faculdade Nome {0} ", fnome);

      }

   } //classe interna faculdade

}//classe Aluno
  • A classe abstrata Admin é externa a classe Alunos();
  • A classe Aluno expõe somente o seu construtor e os métodos getDados e Exibir (ambos são do tipo Public);
  • Todas as outras definições estão encapsuladas na classe;
  • Na classe Aluno eu estou usando a classe interna Faculdade() e a estrutura Exame() visíveis somente dentro da classe Alunos();

Para testamos o código acima e verificar se as classes internas realmente funcionam vamos incluir o código abaixo no método Main():

static void Main(string[] args)

{

//Instancia um objeto do tipo Aluno

Aluno aluno = new Aluno();

 

//Instancia um objeto do tipo classe interna Faculdade

Aluno.Faculdade faculdade = new Aluno.Faculdade();

 

//Atribuindo valores no campo publico do objeto to tipo Aluno

aluno.getDados("S0089", "Macoratti");

 

//Exibino os conteudo do objeto Aluno

aluno.Exibir();

 

//Invocando a fun?Æo getDetalhes9) da calsse interna Faculdade

//para por valores nos campos publicos

faculdade.getDetalhes("V0078", "Faculdades do Norte");

 

//Exibe os componentes da classe interna

faculdade.mostraDetalhes();

 

//cria uma inst?ncia da estrutura interna exame

Aluno.Exame exame = new Aluno.Exame();

 

// atribuindo valores na estrutura da classe interna exame

exame.setDetalhes("RT9870", "Matematica");

 

//exibindo o conteudo da estrutura interna exame

foreach (string x in exame.getDetalhes())

{

Console.Write("{0} ", x);

}

 

//Sobrescrevendo aluno.faculdade com a classe abstrata Admin

Console.WriteLine("\nSaida apos ligação tardia");

 

Admin adm = new Aluno.Faculdade();

adm.getDetalhes("P009", "Janice Lima");

adm.mostraDetalhes();

 

Console.Read();

}

Executando o projeto teremos:

À primeira vista pode parecer um tanto confuso, mas é um recurso que um dia você pode precisar usar, por isso é bom conhecer.

Pegue o projeto aqui: InnerClass.zip

Até o próximo artigo .NET.