Menu
Coddy logo textTech

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.

challenge icon

Défi

Facile

Construisons 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 classe UserProfile dans l'espace de noms Security qui gère les informations utilisateur avec les niveaux d'accès appropriés. Le profil doit comporter :
    • Une propriété public Username (string) - tout le monde peut voir le nom d'utilisateur
    • Un champ private password (string) - seule la classe elle-même doit y accéder
    • Un champ protected email (string) - la classe et ses classes dérivées peuvent y accéder
    • Un champ internal userId (int) - accessible au sein du même assembly
    Incluez un constructeur qui accepte username, password, email, et userId. Ajoutez une méthode public nommée GetPublicInfo() qui retourne "User: {Username}". Ajoutez une autre méthode public nommée ValidatePassword(string input) qui retourne true si l'entrée correspond au mot de passe privé, false sinon.
  • AdminProfile.cs : Créez une classe AdminProfile dans l'espace de noms Security qui hérite de UserProfile. Cette classe démontre comment les membres protected deviennent 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éthode public nommée GetAdminInfo() qui retourne "Admin: {Username}, Email: {email}" - remarquez que vous pouvez accéder au champ protégé email ici !
  • Program.cs : Dans votre fichier principal, créez un UserProfile et un AdminProfile en 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
  • Email
  • 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.com

Remarquez 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()
    }
}
quiz iconTestez-vous

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