Entendendo Classes Aninhadas em C#: Definição, Uso e Herança
Entendendo Classes Aninhadas em C#
Explore como definir, acessar e herdar classes aninhadas em C# com exemplos práticos que demonstram boas práticas.
Em C#, uma classe pode ser declarada dentro de outra classe. O tipo interno é referido como classe aninhada. Por exemplo:
class ClasseExterna { // ... membros externos class ClasseInterna { // ... membros internos } }
Este exemplo cria ClasseInterna dentro de ClasseExterna. O tipo interno é visível apenas dentro do tipo externo a menos que seu modificador de acesso permita o contrário.
Acessando Membros de Classe Aninhada
Para trabalhar com tipos aninhados, você primeiro instancia cada classe separadamente.
1. Crie uma instância da classe externa
ClasseExterna externa = new ClasseExterna();
Aqui, externa é um objeto de ClasseExterna.
2. Crie uma instância da classe aninhada
ClasseExterna.ClasseInterna interna = new ClasseExterna.ClasseInterna();
Como ClasseInterna está aninhada dentro de ClasseExterna, você a qualifica com o nome do tipo externo.
Uma vez instanciada, você pode chamar membros através da referência do objeto.
Exemplo: Classe Aninhada com Métodos
using System; namespace NestedClassDemo { public class Carro { public void ExibirCarro() => Console.WriteLine("Carro: Bugatti"); public class Motor { public void ExibirMotor() => Console.WriteLine("Motor: Motor a Gasolina"); } } class Program { static void Main(string[] args) { Carro carroEsportivo = new Carro(); carroEsportivo.ExibirCarro(); Carro.Motor motorGasolina = new Carro.Motor(); motorGasolina.ExibirMotor(); Console.ReadLine(); } } }
Saída
Carro: Bugatti Motor: Motor a Gasolina
O exemplo mostra como criar objetos tanto da externa Carro quanto da aninhada Motor e invocar seus métodos.
Note que você não pode chamar um método do tipo aninhado diretamente da instância externa:
// Inválido carroEsportivo.ExibirMotor();
Acessando Membros da Classe Externa de Dentro de uma Classe Aninhada
Classes aninhadas podem referenciar membros de seu tipo container. Você pode usar uma instância do tipo externo ou o nome do tipo externo para membros estáticos.
Usando uma Instância para Acessar Membros de Instância
using System; namespace NestedClassDemo { public class Carro { public string Marca = "Bugatti"; public class Motor { public void MostrarMarca() { Carro carro = new Carro(); Console.WriteLine("Marca: " + carro.Marca); } } } class Program { static void Main(string[] args) { Carro.Motor motor = new Carro.Motor(); motor.MostrarMarca(); Console.ReadLine(); } } }
Saída
Marca: Bugatti
Acessando Membros Estáticos Sem Instanciação
using System; namespace NestedClassDemo { public class Carro { public static string Marca = "Bugatti"; public class Motor { public void MostrarMarca() { Console.WriteLine("Marca: " + Carro.Marca); } } } class Program { static void Main(string[] args) { Carro.Motor motor = new Carro.Motor(); motor.MostrarMarca(); Console.ReadLine(); } } }
Saída
Marca: Bugatti
Herança Envolvendo Classes Aninhadas
Classes aninhadas podem participar de herança como qualquer outro tipo.
Derivando uma Classe de uma Classe Externa
using System; namespace NestedClassDemo { class Computador { public void Exibir() => Console.WriteLine("Método da classe Computador"); public class CPU { // Membros adicionais podem ser adicionados aqui } } class Notebook : Computador { // Notebook herda todos os membros de Computador } class Program { static void Main(string[] args) { Notebook notebook = new Notebook(); notebook.Exibir(); Console.ReadLine(); } } }
Saída
Método da classe Computador
Derivando uma Classe de uma Classe Aninhada
using System; namespace NestedClassDemo { class Computador { public class CPU { public void Exibir() => Console.WriteLine("Método da classe CPU"); } } class Notebook : Computador.CPU { // Notebook herda membros de Computador.CPU } class Program { static void Main(string[] args) { Notebook notebook = new Notebook(); notebook.Exibir(); Console.ReadLine(); } } }
Saída
Método da classe CPU
Ao herdar uma classe aninhada, você deve qualificar o tipo com seu nome de classe externa, ex: Computador.CPU.
Linguagem C
- Classes e Objetos em C#: Fundamentos para POO Robusta
- Entendendo Modificadores de Acesso em C#: Public, Private, Protected, Internal e Mais
- Construtores em C#: Tipos, Exemplos e Padrões Avançados
- Palavra-chave Static em C#: Dominando Variáveis, Métodos e Classes Estáticas
- Dominando Classes e Métodos Abstratos em C#: Guia Prático
- Entendendo Classes Aninhadas em C#: Definição, Uso e Herança
- Entendendo Classes e Métodos Parciais em C#
- Dominando Classes e Métodos Sealed em C#: Quando Usar, Exemplos Claros e Segurança de Código
- Dominando Sobrecarga de Construtores em C#
- Entendendo Polimorfismo em C++: Guia Prático