Modificatori di accesso
Fa parte della sezione Programmazione orientata agli oggetti del percorso C# di Coddy. Lezione 31 di 70.
I modificatori di accesso controllano chi può vedere e usare i membri della tua classe. Sono alla base dell'incapsulamento, uno dei principi fondamentali della programmazione orientata agli oggetti (OOP). Limitando l'accesso, proteggi i tuoi dati e definisci confini chiari nel tuo codice.
C# offre quattro principali modificatori di accesso:
public class BankAccount
{
public string AccountHolder; // Accessibile da qualsiasi punto
private decimal balance; // Solo all'interno di questa classe
protected string accountType; // Questa classe e le classi derivate
internal int branchCode; // All'interno dello stesso assembly
}I membri public sono accessibili da qualsiasi codice.
I membri private sono accessibili solo all'interno della stessa classe: questa è la visibilità più restrittiva ed è quella predefinita per i membri della classe.
protected consente l'accesso dalla classe stessa e da qualsiasi classe che eredita da essa.
internal limita l'accesso al codice all'interno dello stesso assembly (progetto).
Quando non viene specificato alcun modificatore, i membri della classe sono private per impostazione predefinita:
class Example
{
int secret; // privato per impostazione predefinita
}Scegliere il livello di accesso giusto significa esporre solo ciò che è necessario. Inizia con private e aumenta la visibilità solo quando hai un motivo chiaro. Questo impedisce ad altro codice di dipendere da dettagli di implementazione che potresti voler modificare in seguito.
Sfida
FacileCostruiamo un sistema sicuro di profili utente che mostri come i modificatori di accesso proteggono i dati sensibili, rendendo disponibili solo le informazioni necessarie. Creerai una classe in cui le diverse informazioni hanno livelli di visibilità differenti, in base a chi dovrebbe potervi accedere.
Organizzerai il codice in tre file:
UserProfile.cs: crea una classeUserProfilenello spazio dei nomiSecurityche gestisce le informazioni utente con livelli di accesso appropriati. Il profilo dovrebbe avere:- Una proprietà
publicUsername(string) - chiunque può vedere il nome utente - Un campo
privatepassword(string) - solo la classe stessa dovrebbe potervi accedere - Un campo
protectedemail(string) - la classe e le sue classi derivate possono accedervi - Un campo
internaluserId(int) - accessibile all'interno dello stesso assembly
publicchiamatoGetPublicInfo()che restituisce"User: {Username}". Aggiungi un altro metodopublicchiamatoValidatePassword(string input)che restituiscetruese l'input corrisponde alla password privata, altrimentifalse.- Una proprietà
AdminProfile.cs: crea una classeAdminProfilenello spazio dei nomiSecurityche eredita daUserProfile. Questa classe mostra come i membriprotecteddiventano accessibili nelle classi derivate. Il costruttore dovrebbe accettare gli stessi quattro parametri e passarli al costruttore della classe base. Aggiungi un metodopublicchiamatoGetAdminInfo()che restituisce"Admin: {Username}, Email: {email}"- nota che qui puoi accedere al campoemailprotected!Program.cs: nel tuo file principale, crea unUserProfilee unAdminProfileusando i valori di input. Mostra i livelli di accesso chiamando i metodi pubblici disponibili e accedendo direttamente al campo internal (dato che ti trovi nello stesso assembly). Mostra quali informazioni può rivelare ciascun tipo di utente.
Riceverai cinque input:
- Nome utente
- Password
- ID utente (intero)
- Tentativo di inserimento della password da convalidare
Stampa l'output in questo formato:
Regular User:
{GetPublicInfo() result}
Internal ID: {userId}
Password valid: {ValidatePassword result}
Admin User:
{GetAdminInfo() result}Ad esempio, se gli input sono alice, secret123, alice@email.com, 1001 e secret123, l'output dovrebbe essere:
Regular User:
User: alice
Internal ID: 1001
Password valid: True
Admin User:
Admin: alice, Email: alice@email.comNota come la password rimanga completamente nascosta: puoi solo convalidarla, non recuperarla mai. L'email è protetta, quindi solo AdminProfile (una classe derivata) può mostrarla. Il campo internal userId è accessibile dal tuo file principale perché si trova nello stesso assembly. Questa è l'incapsulazione in azione!
Provalo tu
using System;
using Security;
class Program
{
public static void Main(string[] args)
{
// Leggi gli input
string username = Console.ReadLine();
string password = Console.ReadLine();
string email = Console.ReadLine();
int userId = Convert.ToInt32(Console.ReadLine());
string passwordAttempt = Console.ReadLine();
// TODO: Crea un oggetto UserProfile con i valori di input
// TODO: Crea un oggetto AdminProfile con gli stessi valori di input
// TODO: Stampa "Regular User:"
// TODO: Stampa il risultato di GetPublicInfo()
// TODO: Stampa "Internal ID: " seguito dal campo userId (accessibile perché si trova nello stesso assembly)
// TODO: Stampa "Password valid: " seguito dal risultato di ValidatePassword()
// TODO: Stampa "Admin User:"
// TODO: Stampa il risultato di GetAdminInfo()
}
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Fondamenti della programmazione orientata agli oggetti
File esterniNamespace e direttiveIntroduzione a classi e oggettiLa parola chiave "this"Metodi e parametriCampi e proprietàCostruttoriInizializzatori di oggettiRiepilogo - Calcolatrice semplice4Ereditarietà
Sintassi di base dell'ereditarietà (:)La parola chiave 'base'Parole chiave virtual e overrideClassi sealedLa classe base 'object'Riepilogo - Gerarchia dei dipendenti7Funzionalità avanzate
Sovraccarico degli operatoriIndicizzatori (this[])Override di ToString()Metodi di estensioneRiepilogo - Lista personalizzata10Pattern di progettazione Parte 1
Introduzione ai pattern di progettazioneSingleton thread-safePattern FactoryPattern Observer (eventi)Pattern Strategy2Proprietà e membri statici
Proprietà implementate automaticamenteProprietà di sola lettura e di sola scritturaCampi e metodi staticiClassi staticheMembri con corpo di espressione5Polimorfismo e interfacce
Polimorfismo a compile time e runtimeInterfaccia o classe astrattaInterfacce multipleInterfacce espliciteUpcasting e downcastingRipasso: calcolatore di forme8Concetti avanzati di programmazione a oggetti
Composizione invece dell'ereditarietàTipi generici (classi e metodi)Delegati ed eventiAttributi e reflectionIDisposable e istruzione usingNozioni di base sull'iniezione delle dipendenze11Pattern di progettazione, parte 2
Pattern del ComandoPattern dell’AdattatorePattern del DecoratorePattern Template MethodPattern dello StatoPattern Composito3Architettura delle classi
Dati di istanza vs staticiParole chiave 'readonly' e 'const'Campi di supportoRiepilogo - Gestore di conti bancari6Incapsulamento
Modificatori di accessoProprietà per l'incapsulamentoImplementazione dell'occultamento dei datiModelli di immutabilitàRiepilogo - Registri degli studentiEsercitati da solo: Compilatore C# online