dimanche 23 mars 2014

9 - Les classes (2/2)

0 commentaires


Le modificateur static se place avant le nom de la classe ou du membre qu'il affecte. Quand vous créez une classe avec des membres, vous faites un moule à objets : à partir de cette classe on fabrique ce qui s'appelle des instances de la classe.
Par exemple si je crée une classe qui contient une chaîne de caractères en champ, chaque instance de la classe aura sa propre version de cette chaîne de caractères.
Le mot-clef static sert à faire que ce qui suit ne dépende pas d'une instance, mais dépende de la classe elle-même.
Voici un exemple :
1public class Person
2{
3    private static int s_count;
4    public static int Count
5    {
6        get { return s_count; }
7    }
8
9    public Person()
10    {
11        s_count++;
12    }
13}
J'espère que vous reconnaissez une classe assez simple, avec un léger changement : la présence d'un champ statique s_count que l'on incrémente à chaque appel du constructeur. En fait j'ai fait un compteur qui indique le nombre d'objets créés. Ce compteur ne dépend pas d'une instance en particulier, mais de la classe entière.
Comment y accéder ?
Pour accéder à des champs statiques, il faut écrire : nomDeLaClasse.nomDuChamp. Ici, il faut écrirePerson.Count pour accéder à s_count qui est mis en private.
On peut aussi utiliser ce modificateur pour une méthode :
1public class Person
2{
3    private static int s_count;
4    public static int Count
5    {
6        get { return s_count; }
7    }
8    
9    public Person()
10    {
11        s_count++;
12    }
13
14    public static void DisplayCount()
15    {
16        Console.WriteLine(s_count + " objet(s) a(ont) été créé(s).");
17    }
18}

Dans ce cas, vous pouvez ensuite écrire Person.DisplayCount();.
Améliorons cette méthode avec des if :
1public static void DisplayCount()
2{
3    if (s_count == 0)
4    {
5        Console.WriteLine("Aucun objet n'a été créé !");
6    }
7    else if (s_count == 1)
8    {
9        Console.WriteLine("Un seul objet a été créé.");
10    }
11    else if (s_count > 1)
12    {
13        Console.WriteLine(s_count + " objets ont été créés.");
14    }
15    else
16    {
17        Console.WriteLine("Erreur : s_count est négatif ! Il vaut : " + s_count);
18    }
19}

Au cas où tous ces Console.WriteLine ne vous auraient pas fait tilt, eh oui, il s'agit bien de l'appel à la méthode statique WriteLine de la classe Console.
Vous pouvez créer une classe entièrement statique, dont le but n'est alors pas de servir de moule à instances. C'est d'ailleurs le cas de la classe Console : on ne veut pas créer d'objet de type Console, mais faire des choses avec celle qui est ouverte. C'est aussi le cas de la classe Convert qui sert à faire des conversions et que nous verrons sous peu. Pour faire cela il faut mettre static devant le nom de la classe, et du coup devant chacun de ses membres :
1public static class MyStaticClass
2{
3    public static int s_myStaticInt;
4
5    public static string TellSomething()
6    {
7        return "This is all static!";
8    }
9}

Rien de bien méchant dans celle-là non plus. Je pense que vous avez saisi l'idée.
Je vous ai dit comment utiliser la console, sans vraiment fournir d'explications. Nous allons donc à présent étudier le code qui se trouve dans une application console fraîchement créée.

Les espaces de noms

Rappels

Un espace de noms contient des classes (avec des membres : champs, méthodes, etc.) ainsi que d'autres espaces de noms.
Ici, nous avons une classe Program au sein de l'espace de noms ConsoleApplication1 (le nom de mon projet, et aussi de ma solution en l'occurrence).
Un espace de noms se comporte à peu près comme un dossier : il peut contenir des fichiers (ici les classes) et d'autres dossiers (les espaces de noms inclus dedans). Pour accéder au contenu d'un espace de noms, il faut mettre un point après son nom : pour accéder à la classe Program, il faut ici écrireConsoleApplication1.Program.

Le mot-clef using

Les espaces de noms peuvent "s'emboîter" à l'infinie, ce qui fait que l'écriture peut être longue :namespace1.namespace2.namespace3.namespace4 ...
On utilise donc le mot-clef using.
Les premières lignes débutent par le mot-clef using, sous la forme d'une directive. En écrivant using System; vous informez Visual Studio que s'il ne trouve pas l'espace de noms ou la classe xxx, il devra regarder s'il/elle n'est pas dans System.xxx.
using peut aussi servir à créer un alias qui référence un espace de noms. Par exemple si nous écrivonsusing Utils = Company.Application.Utilities;, alors nous pourrons écrire Utils.xxxplutôt que d'écrire Company.Application.Utilities.xxx.
D'autre part, using peut être utilisé sous forme de déclaration. Cela permet d'appeler automatiquement la méthode Dispose() de l'objet spécifié. L'objet doit implémenter l'interfaceIDisposable. Je ne veux pas plus vous embrouiller car nous n'avons pas encore vu les interfaces, donc regardez juste cet exemple :
1using (System.IO.StreamReader reader = new StreamReader("readme.txt"))
2{
3    // Lecture du fichier
4}
5// Le fichier est automatiquement fermé (dans la méthode Dispose de l'objet nommé reader) après le bloc.

La classe Program

Cette classe a été automatiquement créée par Visual Studio. Elle contient une seule méthode, nommée "Main", qui prend en entrée un tableau de chaînes de caractères et ne retourne rien (void).
static indique que la méthode est... statique ! :p
Un programme console s'appelle depuis la console en passant des paramètres. Ces derniers sont envoyés au programme dans le tableau args.
Le programme commence à s'exécuter dans la méthode Main : c'est le point d'entrée du programme. C'est donc là que nous allons écrire notre code.
Nous n'en avons pas fini avec les classes, mais vous avez le principal : ça suffit pour le moment.

Leave a Reply