Modificadores de Acesso
Parte da seção Programação Orientada a Objetos do Journey de C# da Coddy — lição 31 de 70.
Modificadores de acesso controlam quem pode ver e usar os membros da sua classe. Eles são a base do encapsulamento - um dos princípios fundamentais da OOP. Ao restringir o acesso, você protege seus dados e cria limites claros em seu código.
O C# fornece quatro modificadores de acesso principais:
public class BankAccount
{
public string AccountHolder; // Acessível de qualquer lugar
private decimal balance; // Apenas dentro desta classe
protected string accountType; // Esta classe e classes derivadas
internal int branchCode; // Dentro do mesmo assembly
}Membros public são acessíveis a partir de qualquer código.
Membros private só podem ser acessados dentro da mesma classe - este é o mais restritivo e o padrão para membros de classe.
protected permite o acesso a partir da própria classe e de qualquer classe que herde dela.
internal restringe o acesso ao código dentro do mesmo assembly (projeto).
Quando nenhum modificador é especificado, os membros da classe são private por padrão:
class Example
{
int secret; // private por padrão
}Escolher o nível de acesso correto trata-se de expor apenas o que é necessário. Comece com private e aumente a visibilidade apenas quando tiver um motivo claro. Isso evita que outros códigos dependam de detalhes de implementação que você pode querer alterar mais tarde.
Desafio
FácilVamos construir um sistema de perfil de usuário seguro que demonstra como os modificadores de acesso protegem dados sensíveis enquanto expõem apenas o que é necessário. Você criará uma classe onde diferentes informações possuem diferentes níveis de visibilidade com base em quem deve ter permissão para acessá-las.
Você organizará seu código em três arquivos:
UserProfile.cs: Crie uma classeUserProfileno namespaceSecurityque gerencia informações de usuário com níveis de acesso apropriados. O perfil deve ter:- Uma propriedade
publicUsername(string) - qualquer um pode ver o nome de usuário - Um campo
privatepassword(string) - apenas a própria classe deve acessar isso - Um campo
protectedemail(string) - a classe e seus filhos podem acessar isso - Um campo
internaluserId(int) - acessível dentro do mesmo assembly
publicchamadoGetPublicInfo()que retorna"User: {Username}". Adicione outro métodopublicchamadoValidatePassword(string input)que retornatruese a entrada corresponder à senha privada,falsecaso contrário.- Uma propriedade
AdminProfile.cs: Crie uma classeAdminProfileno namespaceSecurityque herda deUserProfile. Esta classe demonstra como membrosprotectedtornam-se acessíveis em classes derivadas. O construtor deve aceitar os mesmos quatro parâmetros e passá-los para o construtor base. Adicione um métodopublicchamadoGetAdminInfo()que retorna"Admin: {Username}, Email: {email}"- observe que você pode acessar o campo protegidoemailaqui!Program.cs: No seu arquivo principal, crie umUserProfilee umAdminProfileusando valores de entrada. Demonstre os níveis de acesso chamando os métodos públicos disponíveis e acessando o campo interno diretamente (já que você está no mesmo assembly). Mostre quais informações cada tipo de usuário pode revelar.
Você receberá cinco entradas:
- Username
- Password
- User ID (inteiro)
- Tentativa de senha para validar
Imprima a saída neste formato:
Regular User:
{GetPublicInfo() result}
Internal ID: {userId}
Password valid: {ValidatePassword result}
Admin User:
{GetAdminInfo() result}Por exemplo, se as entradas forem alice, secret123, alice@email.com, 1001 e secret123, a saída deve ser:
Regular User:
User: alice
Internal ID: 1001
Password valid: True
Admin User:
Admin: alice, Email: alice@email.comObserve como a senha permanece completamente oculta - você só pode validá-la, nunca recuperá-la. O e-mail é protegido, então apenas o AdminProfile (uma classe derivada) pode expô-lo. O userId interno é acessível a partir do seu arquivo principal porque está no mesmo assembly. Isso é o encapsulamento em ação!
Folha de consulta
Modificadores de acesso controlam a visibilidade e a acessibilidade dos membros da classe, formando a base do encapsulamento em POO.
O C# fornece quatro modificadores de acesso principais:
public class BankAccount
{
public string AccountHolder; // Acessível de qualquer lugar
private decimal balance; // Apenas dentro desta classe
protected string accountType; // Esta classe e classes derivadas
internal int branchCode; // Dentro do mesmo assembly
}public: acessível a partir de qualquer código
private: acessível apenas dentro da mesma classe (o mais restritivo, padrão para membros de classe)
protected: acessível a partir da própria classe e de quaisquer classes derivadas
internal: acessível apenas dentro do mesmo assembly (projeto)
Quando nenhum modificador é especificado, os membros da classe assumem o padrão private:
class Example
{
int secret; // private por padrão
}Melhor prática: comece com private e aumente a visibilidade apenas quando necessário para evitar que o código externo dependa de detalhes de implementação.
Experimente você mesmo
using System;
using Security;
class Program
{
public static void Main(string[] args)
{
// Ler entradas
string username = Console.ReadLine();
string password = Console.ReadLine();
string email = Console.ReadLine();
int userId = Convert.ToInt32(Console.ReadLine());
string passwordAttempt = Console.ReadLine();
// TODO: Criar um objeto UserProfile com os valores de entrada
// TODO: Criar um objeto AdminProfile com os mesmos valores de entrada
// TODO: Imprimir "Regular User:"
// TODO: Imprimir o resultado de GetPublicInfo()
// TODO: Imprimir "Internal ID: " seguido pelo campo userId (acessível por estar no mesmo assembly)
// TODO: Imprimir "Password valid: " seguido pelo resultado de ValidatePassword()
// TODO: Imprimir "Admin User:"
// TODO: Imprimir o resultado de GetAdminInfo()
}
}
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Programação Orientada a Objetos
1Fundamentos de POO
Arquivos ExternosNamespaces e DiretivasIntrodução a Classes e ObjetosA Palavra-chave 'this'Métodos e ParâmetrosCampos vs PropriedadesConstrutoresInicializadores de ObjetosRecapitulação - Calculadora Simples4Herança
Sintaxe Básica de Herança (:)A Palavra-chave 'base'Palavras-chave Virtual e OverrideClasses SeladasA Classe Base 'object'Recapitulação - Hierarquia de Funcionários7Recursos Avançados
Sobrecarga de OperadoresIndexadores (this[])Sobrescrita de ToString()Métodos de ExtensãoRecapitulação - Lista Personalizada10Padrões de Projeto Parte 1
Introdução aos Padrões de ProjetoSingleton Thread-SafePadrão FactoryPadrão Observer (Eventos)Padrão Strategy2Propriedades e Membros Estáticos
Propriedades AutoimplementadasPropriedades de Apenas Leitura/EscritaCampos e Métodos EstáticosClasses EstáticasMembros com Corpo de Expressão5Polimorfismo e Interfaces
Polimorfismo: Compilação vs ExecuçãoInterface vs Classe AbstrataMúltiplas InterfacesInterfaces ExplícitasUpcasting e DowncastingRecapitulação - Calculadora de Formas8Conceitos Avançados de POO
Composição sobre HerançaGenerics (Classes e Métodos)Delegates e EventosAtributos e ReflectionIDisposable e a Instrução usingFundamentos de Injeção de Dependência11Padrões de Projeto Parte 2
Padrão CommandPadrão AdapterPadrão DecoratorPadrão Template MethodPadrão StatePadrão Composite3Arquitetura de Classes
Dados de Instância vs EstáticosPalavras-chave 'readonly' e 'const'Campos de SuporteRecapitulação - Gerenciador de Conta Bancária6Encapsulamento
Modificadores de AcessoPropriedades para EncapsulamentoImplementação de Ocultação de DadosPadrões de ImutabilidadeRecapitulação - Registros de Estudantes9Argumentos Variáveis
A Palavra-chave 'params'Parâmetros OpcionaisArgumentos NomeadosSobrecarga de Métodos