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.




