Modificateurs d'accès
Fait partie de la section Programmation Orientée Objet du Journey C# de Coddy — leçon 31 sur 70.
Les modificateurs d'accès contrôlent qui peut voir et utiliser les membres de votre classe. Ils constituent le fondement de l'encapsulation - l'un des principes fondamentaux de la POO. En restreignant l'accès, vous protégez vos données et créez des limites claires dans votre code.
C# propose quatre principaux modificateurs d'accès :
public class BankAccount
{
public string AccountHolder; // Accessible de n'importe où
private decimal balance; // Uniquement au sein de cette classe
protected string accountType; // Cette classe et les classes dérivées
internal int branchCode; // Au sein du même assembly
}Les membres public sont accessibles depuis n'importe quel code.
Les membres private ne peuvent être accédés qu'au sein de la même classe - c'est le plus restrictif et le choix par défaut pour les membres de classe.
protected permet l'accès depuis la classe elle-même et toute classe qui en hérite.
internal restreint l'accès au code au sein du même assembly (projet).
Lorsqu'aucun modificateur n'est spécifié, les membres de la classe sont par défaut private :
class Example
{
int secret; // private par défaut
}Choisir le bon niveau d'accès consiste à n'exposer que ce qui est nécessaire. Commencez par private et n'augmentez la visibilité que lorsque vous avez une raison précise. Cela empêche d'autres codes de dépendre de détails d'implémentation que vous pourriez vouloir modifier plus tard.
Défi
FacileConstruisons un système de profil utilisateur sécurisé qui démontre comment les modificateurs d'accès protègent les données sensibles tout en n'exposant que le nécessaire. Vous allez créer une classe où différentes informations ont différents niveaux de visibilité selon qui doit pouvoir y accéder.
Vous organiserez votre code sur trois fichiers :
UserProfile.cs: Créez une classeUserProfiledans l'espace de nomsSecurityqui gère les informations utilisateur avec les niveaux d'accès appropriés. Le profil doit comporter :- Une propriété
publicUsername(string) - tout le monde peut voir le nom d'utilisateur - Un champ
privatepassword(string) - seule la classe elle-même doit y accéder - Un champ
protectedemail(string) - la classe et ses classes dérivées peuvent y accéder - Un champ
internaluserId(int) - accessible au sein du même assembly
publicnomméeGetPublicInfo()qui retourne"User: {Username}". Ajoutez une autre méthodepublicnomméeValidatePassword(string input)qui retournetruesi l'entrée correspond au mot de passe privé,falsesinon.- Une propriété
AdminProfile.cs: Créez une classeAdminProfiledans l'espace de nomsSecurityqui hérite deUserProfile. Cette classe démontre comment les membresprotecteddeviennent accessibles dans les classes dérivées. Le constructeur doit accepter les quatre mêmes paramètres et les transmettre au constructeur de base. Ajoutez une méthodepublicnomméeGetAdminInfo()qui retourne"Admin: {Username}, Email: {email}"- remarquez que vous pouvez accéder au champ protégéemailici !Program.cs: Dans votre fichier principal, créez unUserProfileet unAdminProfileen utilisant les valeurs d'entrée. Démontrez les niveaux d'accès en appelant les méthodes publiques disponibles et en accédant directement au champ interne (puisque vous êtes dans le même assembly). Affichez quelles informations chaque type d'utilisateur peut révéler.
Vous recevrez cinq entrées :
- Username
- Password
- User ID (entier)
- Tentative de mot de passe à valider
Affichez la sortie dans ce format :
Regular User:
{GetPublicInfo() result}
Internal ID: {userId}
Password valid: {ValidatePassword result}
Admin User:
{GetAdminInfo() result}Par exemple, si les entrées sont alice, secret123, alice@email.com, 1001, et secret123, la sortie devrait être :
Regular User:
User: alice
Internal ID: 1001
Password valid: True
Admin User:
Admin: alice, Email: alice@email.comRemarquez comment le mot de passe reste complètement caché - vous pouvez seulement le valider, jamais le récupérer. L'e-mail est protégé, donc seul le AdminProfile (une classe dérivée) peut l'exposer. Le userId interne est accessible depuis votre fichier principal car il se trouve dans le même assembly. C'est l'encapsulation en action !
Aide-mémoire
Les modificateurs d'accès contrôlent la visibilité et l'accessibilité des membres d'une classe, formant ainsi le fondement de l'encapsulation en POO.
C# propose quatre modificateurs d'accès principaux :
public class BankAccount
{
public string AccountHolder; // Accessible de n'importe où
private decimal balance; // Uniquement au sein de cette classe
protected string accountType; // Cette classe et les classes dérivées
internal int branchCode; // Au sein du même assembly
}public : accessible depuis n'importe quel code
private : accessible uniquement au sein de la même classe (le plus restrictif, par défaut pour les membres de classe)
protected : accessible depuis la classe elle-même et toutes les classes dérivées
internal : accessible uniquement au sein du même assembly (projet)
Lorsqu'aucun modificateur n'est spécifié, les membres de la classe sont private par défaut :
class Example
{
int secret; // private par défaut
}Meilleure pratique : commencez par private et n'augmentez la visibilité que lorsque cela est nécessaire pour empêcher le code externe de dépendre des détails d'implémentation.
Essayez vous-même
using System;
using Security;
class Program
{
public static void Main(string[] args)
{
// Lire les entrées
string username = Console.ReadLine();
string password = Console.ReadLine();
string email = Console.ReadLine();
int userId = Convert.ToInt32(Console.ReadLine());
string passwordAttempt = Console.ReadLine();
// TODO: Créer un objet UserProfile avec les valeurs d'entrée
// TODO: Créer un objet AdminProfile avec les mêmes valeurs d'entrée
// TODO: Afficher "Regular User:"
// TODO: Afficher le résultat de GetPublicInfo()
// TODO: Afficher "Internal ID: " suivi du champ userId (accessible car dans le même assembly)
// TODO: Afficher "Password valid: " suivi du résultat de ValidatePassword()
// TODO: Afficher "Admin User:"
// TODO: Afficher le résultat de GetAdminInfo()
}
}
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Programmation Orientée Objet
1Fondamentaux de la POO
Fichiers externesEspaces de noms et directivesIntro aux classes et objetsLe mot-clé 'this'Méthodes et paramètresChamps vs PropriétésConstructeursInitialiseurs d'objetsRécapitulatif - Calculatrice simple4Héritage
Syntaxe de base de l'héritage (:)Le mot-clé 'base'Mots-clés Virtual & OverrideClasses scelléesLa classe de base 'object'Récapitulatif - Hiérarchie des employés7Fonctionnalités avancées
Surcharge d'opérateursIndexeurs (this[])Redéfinition de ToString()Méthodes d'extensionRécapitulatif - Liste personnalisée10Patrons de conception - Partie 1
Introduction aux patrons de conceptionSingleton Thread-SafePatron FabriquePatron Observateur (Événements)Patron Stratégie2Propriétés et membres statiques
Propriétés auto-implémentéesPropriétés en lecture/écriture seuleChamps et méthodes statiquesClasses statiquesMembres à corps d'expression5Polymorphisme & Interfaces
Polymorphisme : Compilation vs ExécutionInterface vs Classe AbstraiteInterfaces MultiplesInterfaces ExplicitesUpcasting & DowncastingRécapitulatif - Calculateur de Formes8Concepts avancés de la POO
Composition plutôt qu'héritageGénériques (Classes et Méthodes)Délégués et ÉvénementsAttributs et RéflexionIDisposable et l'instruction usingBases de l'Injection de Dépendances11Patrons de conception, Partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Méthode TemplatePatron ÉtatPatron Composite3Architecture des classes
Données d'instance vs statiquesMots-clés 'readonly' & 'const'Champs de supportRécapitulatif - Gestionnaire de compte bancaire6Encapsulation
Modificateurs d'accèsPropriétés pour l'encapsulationImplémentation du masquage de donnéesPatterns d'immuabilitéRécapitulatif - Dossiers d'étudiants12Projet : Système de gestion de bibliothèque
Structure du projetModèles Livre et Utilisateur