Dominando Encapsulamento em C#: Protegendo Código e Melhorando Design
Encapsulamento é o processo de enclausurar itens em um pacote físico ou lógico. Na programação orientada a objetos, impede o acesso a detalhes de implementação.
Abstração e encapsulamento são recursos relacionados. Abstração torna informação relevante visível; encapsulamento permite implementar o nível desejado de abstração.
O encapsulamento é implementado usando especificadores de acesso, que definem escopo e visibilidade de membros de classe. C# suporta:
- Public
- Private
- Protected
- Internal
- Protected internal
Especificador Public
Permite que a classe exponha variáveis e funções membro a outras funções e objetos. Qualquer membro público pode ser acessado fora da classe.
Exemplo
using System;
namespace RectangleApplication
{
class Rectangle
{
// variáveis membro públicas
public double length;
public double width;
public double GetArea()
{
return length * width;
}
public void Display()
{
Console.WriteLine("Length: {0}", length);
Console.WriteLine("Width: {0}", width);
Console.WriteLine("Area: {0}", GetArea());
}
}
class ExecuteRectangle
{
static void Main(string[] args)
{
Rectangle r = new Rectangle();
r.length = 4.5;
r.width = 3.5;
r.Display();
Console.ReadLine();
}
}
}
Saída:
Length: 4.5
Width: 3.5
Area: 15.75
As variáveis length e width são public, acessíveis via instância r em Main().
Especificador Private
Esconde variáveis e funções membro de outras funções e objetos. Apenas funções da mesma classe acessam membros privados. Nem uma instância consegue acessá-los.
Exemplo
using System;
namespace RectangleApplication
{
class Rectangle
{
// variáveis membro privadas
private double length;
private double width;
public void AcceptDetails()
{
Console.WriteLine("Digite Length: ");
length = Convert.ToDouble(Console.ReadLine());
Console.WriteLine("Digite Width: ");
width = Convert.ToDouble(Console.ReadLine());
}
public double GetArea()
{
return length * width;
}
public void Display()
{
Console.WriteLine("Length: {0}", length);
Console.WriteLine("Width: {0}", width);
Console.WriteLine("Area: {0}", GetArea());
}
}
class ExecuteRectangle
{
static void Main(string[] args)
{
Rectangle r = new Rectangle();
r.AcceptDetails();
r.Display();
Console.ReadLine();
}
}
}
Saída (exemplo):
Digite Length: 4.4
Digite Width: 3.3
Length: 4.4
Width: 3.3
Area: 14.52
Variáveis private não acessíveis em Main(). Métodos públicos AcceptDetails() e Display() acessam-nas e são chamados via instância r.
Especificador Protected
Permite que classe filha acesse membros da classe base, facilitando herança. Detalhes no capítulo de herança.
Especificador Internal
Expõe membros a outras funções e objetos no mesmo assembly (aplicação). Qualquer classe/método no mesmo assembly acessa membros internal.
Exemplo
using System;
namespace RectangleApplication
{
class Rectangle
{
internal double length;
internal double width;
double GetArea() // sem especificador = private por padrão
{
return length * width;
}
public void Display()
{
Console.WriteLine("Length: {0}", length);
Console.WriteLine("Width: {0}", width);
Console.WriteLine("Area: {0}", GetArea());
}
}
class ExecuteRectangle
{
static void Main(string[] args)
{
Rectangle r = new Rectangle();
r.length = 4.5;
r.width = 3.5;
r.Display();
Console.ReadLine();
}
}
}
Saída:
Length: 4.5
Width: 3.5
Area: 15.75
Nota: GetArea() sem especificador é private por padrão.
Especificador Protected Internal
Esconde membros de outros objetos e funções de classe, exceto classe filha no mesmo assembly. Usado em herança.
Linguagem C
- Classes e Objetos em C#: Fundamentos para POO Robusta
- Entendendo Modificadores de Acesso em C#: Public, Private, Protected, Internal e Mais
- 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
- Encapsulamento em Java Explicado: Ocultação Segura de Dados e Controle
- Entendendo Polimorfismo em C++: Guia Prático
- Dominando Abstração de Dados em C++: Simplifique Design com Separação Interface-Implementação