Exemples de code

Attributs publics ou privés?

Les attributs, données représentant les caractéristiques d'un objet (comme l'âge d'une personne), devraient toujours être privés. C'est une règle fondamentale en programmation orientée objet (POO).

Les buts sont multiples. Il peut s'agir d'empêcher carrément l'accès à cet attribut (le cacher), d'empêcher sa modification par du code externe à la classe ou de contrôler cette modification en forçant le code externe à passer par un mécanisme (méthode ou propriété) prévu à cet effet.

Voyons quelques exemples basés sur la classe suivante :

class Personne
{
    //attributs
    int age; // public ou private?
    ...
}

Empêcher totalement l'accès à un attribut

Peu importe la raison, on peut empêcher l'accès en lecture ou en écriture à un attribut en le déclarant "private" et en ne fournissant aucun mécanisme (méthode ou propriété) pour y accéder.

class Personne
{
    private int age; // accès direct impossible
}

static void Main(string[] args)
{
    Personne bob = new Personne();
    ...

    // tentative d'accès en lecture
    int ageBob = bob.age; // erreur

    // tentative d'accès en écriture
    bob.age = 50;         // erreur
}

Dans ce cas il devient impossible d'accéder à l'attribut, sauf par le code interne de la classe. En fait, le programmeur qui a écrit ici le Main ne devrait même pas connaître l'existence cet attribut.

L'accès est quand même possible par les méthodes de la classe :

class Personne
{
    private int age;

    void UneMethode()
    {
        // accès possible depuis l'intérieur de la classe
        Console.WriteLine("Âge = " + age);
        age = 25; 
    }
}

Permettre l'accès en lecture

Pour permettre à tous un accès en lecture, il faut offrir une méthode d'accès ou bien créer une propriété (ce que nous verrons plus tard).

class Personne
{
    private int age;

    // méthode de type accesseur ("getter" en anglais) 
    public int getAge() {
        return age;
    }
}

static void Main(string[] args)
{
    Personne bob = new Personne();
    ...
    int ageBob = bob.age; // OK
    bob.age = 50;         // erreur
}

Permettre l'accès (contrôlé) en écriture

Pour l'accès à tous en lecture, la situation est plus délicate. Une autre règle importante de la POO stipule qu'un objet est responsable de sa propre cohérence. Il faut donc offrir une méthode d'accès (ou une propriété) qui procédera à une validation des données avant de modifier l'attribut.

class Personne
{
    private int age;

    ...

    // méthode de type mutateur ("setter" en anglais) 
    public void setAge(int age)
    {
        // validation nécessaire pour que l'objet reste cohérent
        if (age > 0 && age < 125)
        {
            // this.age est l'attribut, age est le paramètre formel
            this.age = age;
        }
    }
}

static void Main(string[] args)
{
    Personne bob = new Personne();
    ...
    int ageBob = bob.age; // OK
    bob.age = 50;         // OK
    bob.age = -5;         // erreur
}