C# - Apresentando classes internas


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étodo 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:

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

Até o próximo artigo .NET.

Pegue o projeto aqui: InnerClass.zip


José Carlos Macoratti