Vous êtes sur la page 1sur 21

TDI 1re Anne

Apprentissage d'un langage de Programmation Oriente Objet : C# (objet)

HARCHI Abdellah Formateur NTIC ISTA MAAMORA KENITRA 2011 - 2012

Support de cours POO C# (TDI 1re Anne 2011-2012)

Sommaire
INTRODUCTION ............................................................................................... 3 T.P. N1 1.1 1.2

CLASSE DOBJET - ENCAPSULATION ............................... 4

OBJECTIFS ......................................................................................................... 4 CE QUIL FAUT SAVOIR ................................................................................... 4 1.2.1 Notion de classe................................................................................... 4 1.2.2 Encapsulation ....................................................................................... 4 1.2.3 Dclaration des proprits d'un objet ............................................. 4 1.2.4 Implantation des mthodes .............................................................. 5 1.2.5 Instanciation ......................................................................................... 5 1.2.6 Accs aux proprits et aux mthodes ........................................... 6 1.2.7 Conventions d'criture ....................................................................... 6

1.3

TRAVAIL A REALISER....................................................................................... 6

T.P. N 2 - ENCAPSULATION PROTECTION ET ACCES AUX DONNEES MEMBRES .................................................................... 7


2.1 2.2 OBJECTIFS ......................................................................................................... 7 CE QU'IL FAUT SAVOIR ................................................................................... 7 2.2.1 Protection des proprits ................................................................... 7 2.2.2 Fonctions d'accs aux proprits ..................................................... 7 2.3 TRAVAIL A REALISER....................................................................................... 8

T.P. N 3 - CONSTRUCTION ET DESTRUCTION ..................................... 9


3.1 3.2 OBJECTIFS ......................................................................................................... 9 CE QU'IL FAUT SAVOIR ................................................................................... 9 3.2.1 Constructeurs ....................................................................................... 9 3.2.2 Surcharge des constructeurs ............................................................ 9 3.2.3 Proprits de classe .......................................................................... 10 3.2.4 Mthodes de classe ........................................................................... 10 3.2.5 Destructeur ......................................................................................... 11 3.3 TRAVAIL A REALISER..................................................................................... 11

T.P. N4 - L'HERITAGE ................................................................................ 12


4.1 4.2 OBJECTIFS ....................................................................................................... 12 CE QUIL FAUT SAVOIR ................................................................................. 12 4.2.1 L'hritage ............................................................................................ 12 4.2.2 Protection des proprits et des mthodes ................................. 12 4.2.3 Compatibilit et affectation ............................................................. 13 4.2.4 Mode de reprsentation ................................................................... 14 4.2.5 Insertion d'une classe dans une hirarchie ................................. 14 4.2.6 Insertion d'une nouvelle classe partir de Object ..................... 14
HARCHI Abdellah Page 1 sur 21

Support de cours POO C# (TDI 1re Anne 2011-2012)

4.2.7 Constructeur et hritage .................................................................. 15 4.2.8 Appel aux mthodes de la classe de base .................................... 16 4.3 TRAVAIL A REALISER ..................................................................................... 16

T.P. N5 LES COLLECTIONS ...................................................................17


5.1 5.2 OBJECTIFS ....................................................................................................... 17 CE QU'IL FAUT SAVOIR ................................................................................. 17 5.2.1 Les tableaux statiques ...................................................................... 17 5.2.2 Classe ArraysList................................................................................ 17 5.2.3 La classe Hashtable ........................................................................... 18 5.2.4 SortedList ............................................................................................ 18 SortedList est un dictionnaire qui garantit que les cls sont ranges de faon ascendante...................................................................................... 18 5.3 TRAVAIL A REALISER ..................................................................................... 19

T.P. N 6 - POLYMORPHISME ....................................................................20


6.1 6.2 OBJECTIFS ....................................................................................................... 20 CE QU'IL FAUT SAVOIR ................................................................................. 20 6.2.1 Polymorphisme................................................................................... 20 6.2.2 Mthodes virtuelles ........................................................................... 20 6.2.3 Classes gnriques ............................................................................ 20 6.3 TRAVAIL A REALISER ..................................................................................... 20

HARCHI Abdellah

Page 2 sur 21

Support de cours POO C# (TDI 1re Anne 2011-2012)

INTRODUCTION
Ce support traite des concepts de Programmation Oriente Objet en langage C#. Il est constitu dune liste dexercices permettant de construire pas pas une classe dobjet. Les corrigs types de chaque tape sont prsents dans des rpertoires spars, il s'agit en fait du mme cas qui va voluer, tape par tape, pour aboutir un fonctionnement correct de la classe dans l'univers C#. Chaque exercice est structur de la faon suivante : Description des objectifs viss. Explications des techniques utiliser (Ce quil faut savoir). Enonc du problme rsoudre (Travail raliser). Renvois bibliographiques ventuels dans les ouvrages traitant de ces techniques (Lectures).

HARCHI Abdellah

Page 3 sur 21

Support de cours POO C# (TDI 1re Anne 2011-2012)

T.P. N1 - CLASSE DOBJET - ENCAPSULATION


1.1

OBJECTIFS

Notion de classe d'objet Dfinition d'une nouvelle classe d'objet en C#. Encapsulation des proprits et des mthodes de cet objet. Instanciation de l'objet.

1.2
1.2.1

CE QUIL FAUT SAVOIR


Notion de classe

Crer un nouveau type de donnes, c'est modliser de la manire la plus juste un objet, partir des possibilits offertes par un langage de programmation. Il faudra donc numrer toutes les proprits de cet objet et toutes les fonctions qui vont permettre de dfinir son comportement. Ces dernires peuvent tre classes de la faon suivante : Les fonctions dentre/sortie. Comme les donnes de base du langage C#, ces fonctions devront permettre de lire et dcrire les nouvelles donnes sur les priphriques (clavier, cran, fichier, etc.). Les oprateurs de calcul. Sil est possible de calculer sur ces donnes, il faudra crer les fonctions de calcul. Les oprateurs relationnels. Il faut au moins pouvoir tester si deux donnes sont gales. Sil existe une relation dordre pour le nouveau type de donne, il faut pouvoir aussi tester si une donne est infrieure une autre. Les fonctions de conversion. Si des conversions vers les autres types de donnes sont ncessaires, il faudra implmenter galement les fonctions correspondantes. Intgrit de l'objet. La manire dont est modlis le nouveau type de donnes nest probablement pas suffisant pour reprsenter l'objet de faon exacte. Par exemple, si lon reprsente une fraction par un couple de deux entiers, il faut galement vrifier que le dnominateur dune fraction nest pas nul et que la reprsentation dune fraction est unique (simplification).

La dclaration dun nouveau type de donnes et les fonctions qui permettent de grer les objets associs constituent une classe de lobjet. Les proprits de l'objet seront implantes sous la forme de donnes membres de la classe. Les diffrentes fonctions ou mthodes seront implmentes sous la forme de fonctions membres de la classe. De faon courante, dans le patois de la programmation oriente objet, donnes membres et fonctions membres de la classe sont considres respectivement comme synonymes de proprits et mthodes de l'objet. 1.2.2 Encapsulation

L'encapsulation est un concept important de la Programmation Oriente Objet. L'encapsulation permet de rassembler les proprits composant un objet et les mthodes pour les manipuler dans une seule entit appele classe de l'objet. Une classe, en C# se dclare par le mot cl class suivi d'un identificateur de classe choisi par le programmeur de la faon suivante : public class NomDeLaClasse { // Dclaration des proprits et // des mthodes de l'objet } Le fichier contenant le code source portera le nom NomdeLaClasse.cs. Les identifiants de classe obissent aux mmes rgles que les identifiants de variables et de fonctions. Par convention, ils commencent par une Majuscule (C# considre les majuscules comme des caractres diffrents des minuscules). Les proprits et les mthodes de l'objet seront dclares et implmentes dans le bloc { } contrl par le mot cl class. Cela constitue l'implmentation du concept d'encapsulation en C#. 1.2.3 Dclaration des proprits d'un objet

Les proprits d'un objet sont dclares, comme des variables, l'intrieur du bloc { } contrl par le mot cl class. public class NomDeLaClasse

HARCHI Abdellah

Page 4 sur 21

Support de cours POO C# (TDI 1re Anne 2011-2012) {

TypeDeLaPropriet

NomDeLaPropriete;

// Dclaration des mthodes de l'objet

Les proprits peuvent tre dclares tout moment l'intrieur du corps de la classe. Chaque dclaration de proprit est construite sur le modle suivant : TypeDeLaPropriet NomDeLaPropriete;

Une proprit peut tre initialise lors de sa dclaration : TypeDeLaPropriet NomDeLaPropriete = valeurInitiale;

Les identifiants de proprit par convention commencent par une majuscule. Comme toutes les instructions du langage C#, chaque dclaration de proprit DOIT absolument tre termine par un point-virgule ; Le point-virgule ne constitue pas un sparateur, mais un terminateur d'instructions. Implantation des mthodes

1.2.4

Les mthodes d'une classe sont implmentes, l'intrieur du bloc { } contrl par le mot cl class. Quand on considre une mthode par rapport l'objet laquelle elle est applique, il faut voir l'objet comme tant sollicit de l'extrieur par un message. Ce message peut comporter des paramtres. L'objet doit alors ragir ce message en excutant cette fonction ou mthode. public class NomDeLaClasse { // Dclaration des proprits de l'objet int Vitesse = 30 ; TypeResultat NomDeMethode(Type1 par1, Type2 par2) { // Instructions de la mthode return expression ; } Les identifiants de mthodes commencent par une majuscule. Comme toutes les instructions du langage C#, les instructions dfinissant le fonctionnement de la mthode DOIVENT absolument tre termines par un point-virgule ; Le point-virgule ne constitue pas un sparateur, mais plutt un terminateur d'instructions. Si aucun paramtre n'est dsign explicitement entre les parenthses, le compilateur considre la mthode comme tant sans paramtre. Dans ce cas, les parenthses sont nanmoins obligatoires. Sauf si le rsultat de la mthode est de type void, l'une des instructions doit tre return suivi d'une expression dont le rsultat est de mme type. Ce rsultat constitue le retour de la mthode et peut tre exploit par le programme envoyant le message.

Les fonctions dveloppes, dans le cadre des T.P. du support prcdent, peuvent tre considres comme des mthodes de la classe application. L'une de ces mthodes est la fonction Main. Cette fonction constituant le point d'entre de l'application peut tre considre comme la mthode excute en rponse d'un message envoy par le systme (la machine virtuelle C#) qui signifierait "dmarre". 1.2.5 Instanciation

Pour qu'un objet ait une existence, il faut qu'il soit instanci. Une mme classe peut tre instancie plusieurs fois, chaque instance ayant des proprits ayant des valeurs spcifiques. En C#, il n'existe qu'une seule manire de crer une instance d'une classe. Cette cration d'instance peut se faire en deux temps : Dclaration d'une variable du type de la classe de l'objet, Instanciation de cette variable par l'instruction new.

Par exemple, l'instanciation de la classe String dans la fonction main d'une classe application se passerait de la faon suivante : public static void Main(String[] args) { String s; s = new String("ISTA");

HARCHI Abdellah

Page 5 sur 21

Support de cours POO C# (TDI 1re Anne 2011-2012) } La dclaration d'une variable s de classe Salarie n'est pas suffisante. En effet, s ne contient pas une donne de type Salarie. s est une variable qui contient une rfrence sur un objet. Par dfaut, la valeur de cette rfrence est null, mot cl C# signifiant que la variable n'est pas rfrence. La rfrence d'un objet doit tre affecte cette variable. Cette rfrence est calcule par l'instruction new au moment de l'instanciation. Ces deux tapes peuvent tre rduites une seule instruction : String s = new String("ISTA"); 1.2.6 Accs aux proprits et aux mthodes

Bien qu'un accs direct aux proprits d'un objet ne corresponde pas exactement au concept d'encapsulation de la programmation oriente objet, il est possible de le faire en C#. On verra, au chapitre suivant, comment protger les donnes membres en en interdisant l'accs. L'accs aux proprits et aux mthodes d'une classe se fait par loprateur.. Oprateur. Fraction fr1 = new Fraction(); fr1.Numerateur = 3; fr1.Denominateur = 4; fr1.Afficher(); 1.2.7 Conventions d'criture

Quand on dbute la Programmation Oriente Objet, l'un des aspects le plus rebutant est l'impression d'parpillement du code des applications. En respectant quelques conventions dans l'criture du code et en organisant celui-ci de faon rationnelle, il est possible de remdier facilement cet inconvnient. Ces conventions ne sont pas normalises et peuvent diffrer en fonctions des ouvrages consults. Les classes Tous les identificateurs de classe commencent par une Majuscule. Par exemple : Fraction. Les proprits Tous les identificateurs public de proprits commencent par une majuscule, les proprits private ou protected par une minuscule. Par exemple : private denominateur, numerateur. (sans accent) Mthode Elle commence par une lettre en majuscule. exemple : AjouterVehicule() ; Demarrer() ; InsererFichier () ; le premier mot est un verbe. Les noms de fichiersConvention dcriture: On codera chaque classe d'objet dans des fichiers diffrents dont l'extension sera .cs Le nom de fichier sera identique au nom de la classe. Exemple pour la classe Fraction : Fraction.cs Les noms de fichiersConvention dcriture: Les noms de vairiables de travail commencent par une minuscule 1.3 TRAVAIL A REALISER Crer la classe clsSalarie. Cette classe aura 5 proprits de type public: matricule Matricule int catgorie Categorie int service Service int nom Nom String salaire Salaire double Crer une mthode public CalculerSalaire pour afficher la mention "Le salaire de " suivie du nom du salari, suivi de " est de ", suivi de la valeur du salaire.

Implanter une classe application, avec une mthode Main dans laquelle la classe Salarie sera instancie pour en tester les proprits et les mthodes.

HARCHI Abdellah

Page 6 sur 21

Support de cours POO C# (TDI 1re Anne 2011-2012)

T.P. N 2 - ENCAPSULATION PROTECTION ET ACCES AUX DONNEES MEMBRES


2.1

OBJECTIFS

Protection des proprits (donnes membres). Fonctions de type Get et Set, d'accs aux proprits.

2.2
2.2.1

CE QU'IL FAUT SAVOIR


Protection des proprits

En Programmation Oriente Objet, on vite d'accder directement aux proprits par loprateur. En effet, cette possibilit ne correspond pas au concept d'encapsulation. Certains langages l'interdisent carrment. En C#, c'est le programmeur qui choisit si une donne membre ou une fonction membre est accessible directement ou pas. Par dfaut, en C#, toutes les proprits et mthodes sont accessibles directement. Il faut donc prciser explicitement les conditions d'accs pour chaque proprit et chaque mthode. Pour cela, il existe trois mots-cls : public - Aprs ce mot cl, toutes les donnes ou fonctions membres sont accessibles. private - Aprs ce mot cl, toutes les donnes ou fonctions membres sont verrouilles et ne seront pas accessibles dans les classes drives. protected - Aprs ce mot cl, toutes les donnes ou fonctions membres sont verrouilles mais sont nanmoins accessibles dans les classes drives.

La distinction entre private et protected n'est visible que dans le cas de la dclaration de nouvelles classes par hritage. Ce concept sera abord ultrieurement dans ce cours. Afin dimplanter correctement le concept d'encapsulation, il convient de verrouiller l'accs aux proprits et de les dclarer private, tout en maintenant l'accs aux mthodes en les dclarant public. Exemple : public class Client { private int numeroClient; private String nomClient; private double caClient;

// numro client // nom du client // chiffre d'affaire client

} 2.2.2

public void AugmenterCA(double montant) { caClient = montant; } Fonctions d'accs aux proprits

Si les proprits sont verrouilles, on ne peut plus y avoir accs de l'extrieur de la classe. Il faut donc crer des mthodes ddies l'accs aux proprits pour chacune d'elles. Ces mthodes doivent permettre un accs dans les deux sens : pour connatre la valeur de la proprit. Ces mthodes sont appeles mthodes de type Get.?". La rponse de l'objet, donc la valeur retourne par la mthode Get, doit tre cette valeur. Par exemple, pour la proprit numeroClient, dclare int, la fonction Get serait dclare de la faon suivante : public int Numero() { return numeroClient; } ou public GetNumero()

Cette fonction pourra tre utilise dans la fonction Main, par exemple : Client cli = new Client(); int numero = cli.numeroClient; int numero = cli. Numero ();

ou cli.GetNumero();

pour modifier la valeur d'une proprit. Ces mthodes sont appeles mthodes Set. Cette mthode ne retourne aucune rponse. Par contre, un paramtre de mme nature que la proprit doit lui tre indique. Par exemple, pour la proprit numeroClient, dclare int, la fonction Set sera dclare de la faon suivante : public void Numero(int numero) ou SetNumero(int numero) { numeroClient = numero; }

HARCHI Abdellah

Page 7 sur 21

Support de cours POO C# (TDI 1re Anne 2011-2012)

Cette fonction pourra tre utilise dans la fonction main, par exemple : Client sal = new Client(); cli.numeroClient = 5; cli.Numero(5); L'intrt de passer par des fonctions Set est de pouvoir y localiser des contrles de validit des paramtres passs pour assurer la cohrence de l'objet, en y dclenchant des exceptions par exemple. La scurisation des classes sera aborde ultrieurement dans ce cours. 2.3 TRAVAIL A REALISER A partir du travail ralis au T.P. N 1, modifier la classe clsSalarie pour : protger les proprits et en interdire l'accs de l'extrieur de l'objet (l'accs aux fonctions membres doit toujours tre possible), crer les mthodes d'accs aux attributs Get et Set. Modifier la fonction Main de la classe Application pour tester.

HARCHI Abdellah

Page 8 sur 21

Support de cours POO C# (TDI 1re Anne 2011-2012)

T.P. N 3 - CONSTRUCTION ET DESTRUCTION


3.1

OBJECTIFS

Constructeurs et destructeur des objets Proprits et mthodes de classe

3.2
3.2.1

CE QU'IL FAUT SAVOIR


Constructeurs

Quand une instance d'une classe d'objet est cre au moment de l'instanciation d'une variable avec new, une fonction particulire est excute. Cette fonction s'appelle le constructeur. Elle permet, entre autre, d'initialiser chaque instance pour que ses proprits aient un contenu cohrent. Un constructeur est dclar comme les autres fonctions membres deux diffrences prs : Le nom de l'identificateur du constructeur est le mme nom que l'identificateur de la classe. Un constructeur ne renvoie pas de rsultat.

Exemple : public Client() { // code du constructeur sans paramtre } 3.2.2 Surcharge des constructeurs

Il peut y avoir plusieurs constructeurs pour une mme classe, chacun d'eux correspondant une initialisation particulire. Tous les constructeurs ont le mme nom mais se distinguent par le nombre et le type des paramtres passs (cette proprit s'appelle surcharge en C#). Quand on cre une nouvelle classe, il est indispensable de prvoir tous les constructeurs ncessaires. Deux sont particulier : Constructeur d'initialisation Ce constructeur permet de procder une instanciation en initialisant toutes les proprits, la valeur de celles-ci tant passe dans les paramtres. Pour la classe Client, ce constructeur est dclar comme ceci : public class Client { private int numeroClient; private String nomClient; private double caClient;

// numro client // nom du client // chiffre d'affaire client

public void AugmenterCA(double montant) { caClient = montant; }

// constructeur public Client(int numero, String nom , double ca) { numeroClient = numero; nomClient = nom; caClient = ca; } } Cela va permettre d'instancier la classe Client de la faon suivante : public static void Main (String[] args) { Salarie sal = new Client(2,"Toto" 2500.00); // ... } Constructeur par dfaut Un constructeur par dfaut existe dj pour chaque classe si aucun autre constructeur n'est dclar. A partir du moment o le constructeur d'initialisation de la classe Client existe, il devient impossible de dclarer une instance comme on l'a fait dans le T.P. prcdent : Salarie sal = new Salarie();

HARCHI Abdellah

Page 9 sur 21

Support de cours POO C# (TDI 1re Anne 2011-2012) Pour qu'une telle dclaration, sans paramtre d'initialisation, soit encore possible, il faut crer un constructeur par dfaut. En fait ce n'est rellement indispensable que si une instanciation de l'objet, avec des valeurs par dfaut pour ses proprits, a un sens. Pour la classe Client, on peut s'interroger sur le sens des valeurs par dfaut des proprits. A titre d'exemple, ce constructeur serait dclar comme ceci : public Client() { numeroClient = 0; nomClient = "Dupont"; caClient = 0.00; } Constructeur de recopie Le constructeur de recopie permet de recopier les proprits d'un objet existant dans vers la nouvelle instance public static void Main (String[] args) { Client client1 = new Client(); // 1 Client client2 = new Client (client1); // 2 Client cli = new Client(2,"Toto",17500.00); // 3 } // ...

En 1, client1 est un objet cr via le constructeur par dfaut. La proprit nomClien" est initialis par "Dupont" En 2, salarie2 est un objet diffrent de salarie1 mais les proprits des deux objets ont les mmes valeurs. Pour cela, le dveloppeur doit crire un constructeur de recopie. En 3, salarie3 est instanci via le constructeur d'initialisation public Client (Client unClient) { numeroClient = unClient. numeroClient; nomClient = unClient.nomClient ; caClient = unClient. caClient; } 3.2.3 Proprits de classe

Jusqu' prsent, les proprits dclares taient des proprits d'instance. C'est dire que les proprits de chaque objet, instanci partir de la mme classe, peuvent avoir des valeurs diffrentes ( numero, nom, etc ). Supposons donc maintenant, que dans la classe Client, il soit ncessaire de disposer d'un compteur d'instance, dont la valeur serait le nombre d'instances en cours un instant donn. En C#, il est possible de crer des proprits de classe. Leur valeur est la mme pour toutes les instances d'une mme classe. Pour dclarer une telle proprit, on utilise le mot-cl static. Par exemple, dans la classe Salarie, le compteur d'instance pourrait tre dclar : public class Client { private static int compteur = 0; } La proprit de classe compteur, initialise 0 lors de sa dclaration, sera incrmente de 1 dans tous les constructeurs dvelopps pour la classe Client. Sa valeur sera le nombre d'instances valides un instant donn. 3.2.4 Mthodes de classe

Comme pour les autres proprits dclares private, il est ncessaire de crer les mthodes d'accs associes. Pour ce compteur, seule la mthode Get est ncessaire. Cependant, comme les proprits de classe sont partages par toutes les instances de la classe, le fait d'envoyer un message Get pour obtenir leur valeur n'a pas de sens. En reformulant, on pourrait dire que le message Get envoyer pour obtenir le nombre d'instances de classe Salarie ne doit pas tre envoye une instance donne de cette classe, mais plutt la classe elle-mme. De telles mthodes sont appeles mthodes de classe. Une mthode de classe est dclare par le mot-cl static. Pour la mthode Get d'accs au compteur d'instance on dclarerait : public static int Compteur() ou GetCompteur() { return compteur; } L'appel une mthode static est sensiblement diffrent aux appels standard. En effet, ce n'est pas une instance particulire que le message correspondant doit tre envoy, mais la classe.

HARCHI Abdellah

Page 10 sur 21

Support de cours POO C# (TDI 1re Anne 2011-2012) Dans la fonction Main, par exemple, si l'on veut affecter une variable le nombre d'instances de la classe Salarie, cela s'crirait : public static void Main (String[] args) { Client cli = new Client(2,"Toto",17500.00); // ... int nInst = cli.compteur(); // private int nInst = Client.Compteur(); } 3.2.5 Destructeur

En C# on ne peut pas dclencher explicitement la destruction d'un objet. Les instances sont automatiquement dtruites lorsqu'elles ne sont plus rfrences. Le programme qui se charge de cette tche s'appelle le Garbage Collector ou, en franais, le ramasse-miettes. Le Garbage Collector est un systme capable de surveiller les objets crs par une application, de dterminer quand ces objets ne sont plus utiles, dinformer sur ces objets et de dtruire les objets pour rcuprer leurs ressources. Or si l'on veut que le compteur d'instances soit jour, il est ncessaire de connatre le moment ou les instances sont dtruites pour dcrmenter la variable compteur. C'est pour cela que le ramasse miettes envoie un message chaque instance avant qu'elle soit dtruite, et ceci quelle que soit la classe. Il suffit d'crire la mthode de rponse ce message, c'est la mthode Finalize(). Cette mthode s'appelle destructeur. C'est , bien sr, une mthode d'instance de la classe que l'on est en train de dvelopper. Dans la classe Client par exemple, elle se dclare OBLIGATOIREMENT de la faon suivante : protected void Finalize() { compteur --; // dcrmentation du compteur } L'exemple suivant permet de visualiser le fonctionnement asynchrone du Garbage Collector. ( si vous avez de la chance ) Le programme principal Main propose une boucle permettant de crer un grand nombre d'instances de la classe Detruire. A chaque instanciation, le programme perd la rfrence sur l'objet cr auparavant et le destructeur est ainsi invoqu. Le fait de crer un grand nombre d'instance laisse le temps au "thread" du garbage collectior de faire sont travail. public class Gc { public static void Main(String args[]) { Detruire d = new Detruire (); for (int i = 0 ; i < 1000000000 ; i++) { d = new Detruire (); } } } ////////////////////////////////////////////////////// public class Detruire { static int count = 0; public Detruire () { count++; } protected void Finalize() { Console.WriteLine ("objet dtruit " ); }} 3.3 TRAVAIL A REALISER A partir du travail ralis au T.P. N 2, implmenter les constructeurs et le destructeur de la classe Salarie. Afin de mettre en vidence les rles respectifs des constructeurs et du destructeur, implmenter ceux-ci pour qu'ils affichent un message chaque fois qu'ils sont excuts. Implmenter un compteur d'instances pour la classe Salarie. Ajouter une mthode de classe permettant de mettre le compteur zro ou une valeur prdfinie. Modifier le jeu d'essai de l'application Main pour tester ces fonctions.

HARCHI Abdellah

Page 11 sur 21

Support de cours POO C# (TDI 1re Anne 2011-2012)

T.P. N4 - L'HERITAGE
4.1

OBJECTIFS

Gnralits sur l'hritage Drivation de la classe racine Object

4.2
4.2.1

CE QUIL FAUT SAVOIR


L'hritage

Le concept d'hritage est l'un des trois principaux fondements de la Programmation Oriente Objet, le premier tant l'encapsulation vu prcdemment dans les T.P. 1 3 et le dernier tant le polymorphisme qui sera abord plus loin dans ce document. L'hritage consiste en la cration d'une nouvelle classe dite classe drive partir d'une classe existante dite classe de base ou classe parente. L'hritage permet de : rcuprer le comportement standard d'une classe d'objet (classe parente) partir de proprits et des mthodes dfinies dans celles-ci, ajouter des fonctionnalits supplmentaires en crant de nouvelles proprits et mthodes dans la classe drive, modifier le comportement standard d'une classe d'objet (classe parente) en surchargeant certaines mthodes de la classe parente dans la classe drive.

Exemple : class ClasseA { // Proprits de la classe A public int dataA; // Mthodes de la classe A public int FonctionA1() { // Code de la mthode fonctionA1 } public virtual int FonctionA2() //surchargeable { // Code de la mthode fonction A2 } } class ClasseB : ClasseA { // Proprits de la classe B public int dataB; // Mthodes de la classe B public override int FonctionA2() // surcharge { // Code de la mthode fonctionA2 } public int FonctionB1() { // Code de la mthode fonctionB2 } } Dans cet exemple : ClasseA est la classe parente. ClasseB est une classe drive de la classe ClasseA. dataA est une proprit de la classe ClasseA. Par hritage, dataA est aussi une proprit de la classe ClasseB. dataB est une proprit de la classe ClasseB (mais pas de ClasseA). FonctionA1 est une mthode de la classe ClasseA. Par hritage, c'est aussi une mthode de la classe ClasseB. FonctionB1 est une mthode de la classe ClasseB (mais pas de ClasseA). FonctionA2 est une mthode des classes ClasseA et ClasseB. 4.2.2 dans la classe A, FonctionA2() est dclare virtual car elle est surchargeable dans la classe B dans la classe B, FonctionA2 est dclare override car elle remplace la mthode de la classe A Protection des proprits et des mthodes

En plus des mots-cls public et private dcrits dans les chapitres prcdents, il est possible d'utiliser un niveau de protection intermdiaire de proprits et des mthodes par le mot-cl protected. Les exemples ci-dessous permettent d'illustrer ces diffrents niveaux de protection.

HARCHI Abdellah

Page 12 sur 21

Support de cours POO C# (TDI 1re Anne 2011-2012) Exemple pour la dclaration des classes ClasseA et ClasseB : public class ClasseA { // Proprits de la classe A private int dataA1; protected int dataA2; public int dataA3; // Mthodes de la classe A public int FonctionA() { dataA1 = 5; // 1 dataA2 = 6; dataA3 = 7; dataB = 8; // 2 }

public class ClasseB : ClasseA { // Proprits de la classe B public int dataB; // Mthodes de la classe B public int FonctionB() { dataA1 = 15; // 3 dataA2 = 16; dataA3 = 17; dataB = 18; }}; Exemple pour l'utilisation d'instances des classes ClasseA et ClasseB : public static void Main (String[] args) { ClasseA ca = new ClasseA(); ClasseB cb = new ClasseB(); ca.dataA1 = 5; // 4 ca.dataA2 = 6; // 5 ca.dataA3 = 7; // 6 cb.dataA1 = 5; // 7 cb.dataA2 = 6; // 8 cb.dataA3 = 7; // 9 cb.dataB = 8; dataA1, dataA2 et dataA3 sont des proprits de la classe ClasseA respectivement private, protected et public. FonctionA est une mthode de ClasseA et FonctionB une mthode de ClasseB. dataA1, dataA2 et dataA3 sont des proprits de ClasseA. Elles sont donc directement accessibles dans toutes les mthodes de ClasseA, donc dans FonctionA. dataB est proprit de ClasseB (classe drive de ClasseA). Une proprit d'une classe drive est inaccessible dans la classe de base. dataA1 est dclare private dans la classe ClasseA. Elle fait bien partie des composantes de la classe ClasseB mais est inaccessible dans toutes les mthodes de cette classe. dataA1 est dclare private dans la classe ClasseA. Elle est inaccessible dans toutes les fonctions qui utilisent des instances de la classe ClasseA. Il n'y a pas ici de distinction entre private et protected. dataA2 est dclare protected dans la classe ClasseA. Elle est inaccessible dans toutes les fonctions qui utilisent des instances de la classe ClasseA. Il n'y a pas ici de distinction entre private et protected. dataA3 est dclare public dans la classe ClasseA. Elle est donc directement accessible dans toutes les fonctions qui utilisent des instances de la classe ClasseA. dataA1 est dclare private dans la classe ClasseA. Elle est inaccessible dans toutes les fonctions qui utilisent des instances de la classe ClasseB. dataA2 est dclare protected dans la classe ClasseA. Elle est accessible dans toutes les fonctions qui utilisent des instances de la classe ClasseB. dataA3 est dclare public dans la classe ClasseA. Elle est donc directement accessible dans toutes les fonctions qui utilisent des instances de la classe ClasseB. Compatibilit et affectation

} 1. 2. 3. 4. 5. 6. 7. 8. 9.

4.2.3

Lors des affectations (oprateurs =), il est possible de mlanger des instances de classes diffrentes. Cependant, il y a quelques rgles observer :

HARCHI Abdellah

Page 13 sur 21

Support de cours POO C# (TDI 1re Anne 2011-2012) ClasseA caObj; ClasseB cbObj; ClasseA est une classe ClasseB est une classe caObj est une instance cbObj est une instance de base. drive de ClasseA. de la classe ClasseA. de la classe ClasseB.

L'instruction caObj = cbObj; est lgale. Elle affecte caObj l'objet rfrenc par cbObj. Ceci est possible car une instance de ClasseB est aussi une instance de ClasseA. Il n'y pas de conversion ici au sens propre. L'objet rfrenc par caObj reste une instance de ClasseB. Une variable d'une classe de base est compatible avec les variables de toutes ses classes drives. L'instruction cbObj = caObj; gnre une erreur de compilation. Cependant, si caObj contient une rfrence sur une instance de ClasseB, une telle affectation peut tre force par un casting (changement de type) : cbObj = (ClassB)pcaObj; Mode de reprsentation

4.2.4

Le concept d'hritage peut tre utilis pratiquement l'infini. On peut crer des classes drives partir de n'importe quelle autre classe, y compris celles qui sont dj des classes drives. Supposons que ClasseB et ClasseC soient des classes drives de ClasseA et que ClasseD et ClasseE soient des classes drives de ClasseB. Les instances de la classe ClasseE auront des donnes et des fonctions membres communes avec les instances de la classe ClasseB, voire de la classe ClasseA. Si les drivations sont effectues sur plusieurs niveaux, une reprsentation graphique de l'organisation de ces classes devient indispensable. Voici la reprsentation graphique de l'organisation de ces classes :

ClasseA ClasseB ClasseD ClasseE


Le diagramme ci-dessus constitue la reprsentation graphique de la hirarchie de classes construite partir de ClasseA. Dans le cadre de la conception oriente objet, la mthode UML (United Modeling Language) propose une autre reprsentation graphique d'une telle hirarchie :
ClasseA

ClasseC

ClasseB

ClasseC

ClasseE

ClasseD

4.2.5

Insertion d'une classe dans une hirarchie

Bien que l'on ait opr comme cela depuis le dbut de ce cours, la cration d'une nouvelle classe indpendante et isole n'a pratiquement aucun intrt en Programmation Oriente Objet. Afin de rendre homogne le comportement des instances d'une nouvelle classe il est important de l'insrer dans une bibliothque de classe existante. Cette bibliothque est fournie sous la forme d'une hirarchie de classes construite partir d'une classe racine. En C#, il est impossible de crer une classe isole. En effet, lorsqu'on cre une nouvelle classe sans mentionner de classe de base, c'est la classe Object , la classe racine de toutes les classes C#, qui est utilise.
Object NewClass

NewClass est une nouvelle classe insre dans la hirarchie de classes construite partir de Object. Le Framework .NET propose une hirarchie de classes normalises prtes l'emploi, ou driver. 4.2.6 Insertion d'une nouvelle classe partir de Object

La drivation d'une classe par rapport une classe prdfinie doit obir un certain nombre de rgles dfinies dans la documentation de la classe de base driver. L'une de ces contraintes est la surcharge OBLIGATOIRE de certaines mthodes de la classe de base avec la mme signature. Pour driver la classe Object, cas le plus courant, cela se rsume ne rcrire que quelques mthodes :

HARCHI Abdellah

Page 14 sur 21

Support de cours POO C# (TDI 1re Anne 2011-2012) Mthode Finalize Il s'agit du destructeur dont on dj dcrit le rle dans le chapitre prcdent. Mthode ToString Cette mthode doit crer une chane de caractres (instance de la classe String) qui reprsente les proprits des instances de la classe. Par exemple, pour la classe Fraction, la chane de caractres reprsentant une fraction pourrait tre "nnnn/dddd" o nnnn et dddd correspondraient respectivement aux chiffres composant le numrateur et le dnominateur de la fraction. class Fraction { private long numerateur; private long denominateur; public String ToString() { return numerateur + "/" + denominateur; }

La mthode ToString est appele lorsqu'une conversion implicite d'un objet en chane de caractres est ncessaire comme c'est le cas pour la fonction WriteLine de l'objet Console, par exemple : Fraction fr = new Fraction(1,2); Console.WriteLine("fraction = " + fr); Mthode Equals Cette mthode doit rpondre VRAI si deux instances sont rigoureusement gales. Deux conditions sont vrifier : Il faut que les deux objets soient de la mme classe. Le paramtre de la mthode Equals tant de type Object, notre instance peut donc tre compare une instance d'une classe quelconque drive de Object. Il faut qu'une rgle d'galit soit applique : par exemple deux objets client sont gaux si leurs numros sont gaux .; pour la classe Fraction, on peut dire que deux fractions sont gales si le produit des extrmes est gal au produit des moyens. Ce qui peut s'crire : class Fraction { private long numerateur; private long denominateur; public boolean equals(Fraction fr) { return numerateur * fr). denominateur == denominateur * fr ). numerateur; } Constructeur et hritage

} 4.2.7

Chaque constructeur d'une classe drive doit obligatoirement appeler le constructeur quivalent de la classe de base. Si BaseClass est une classe de base appartenant la hirarchie de classe construite partir de Object, si NewClass est une classe drive de BaseClass, cela se fait de la faon suivante en utilisant le mot-cl base : Constructeur par dfaut public NewClass() : BaseClass { public NewClass() : base() // constructeur // les donnes membres de la classe de base sont // initialises par le constructeur par dfaut // de cette classe de base // Initialisation des nouvelles donnes membres // de la classe drive } Constructeur d'initialisation public NewClass (Valeurs des proprits de NewClass) : base(Valeur des proprits de la classe BaseClass); { // Initialisation des nouvelles donnes membres // de la classe drive de BaseClass

L'appel de : base(valeurs ) initialise la partie de l'objet cr avec BaseClass en utilisant le constructeur d'initialisation celle-ci . Puis on complte l'objet en initialisant les attributs spcifiques NewClass

HARCHI Abdellah

Page 15 sur 21

Support de cours POO C# (TDI 1re Anne 2011-2012) 4.2.8 Appel aux mthodes de la classe de base

Lors de la surcharge d'une mthode de la classe de base dans une classe drive, il peut tre utile de reprendre la fonctionnalit standard pour y ajouter les nouvelles fonctionnalits. Pour ne pas avoir rcrire le code de la classe de base (dont on ne dispose pas forcment), il est plus simple de faire appel la mthode de la classe de base. Pour cela on utilise le mot-cl base avec une syntaxe diffrente celle utilise pour le constructeur : public override String Methode1(String s) { // Calcul du rsultat standard par appel // la mthode de la classe de base String resultat = base.Methode1(s); // Calcul du nouveau rsultat en modifiant // le rsultat standard resultat = resultat + "," + data2; return resultat; } Attention : la mthode Methode1 de la classe de base devra avoir la signature suivante public virtual String Methode1(String s) 4.3 TRAVAIL A REALISER Pour ce travail, raliser partir de ce qui a t produit au T.P. N 3, on procdera en deux temps : Ajouter la classe Salarie les mthodes Equals et ToString. La rgle d'galit pour la classe Salarie peut s'noncer de la faon suivante : deux salaris sont gaux s'ils ont le mme numro de matricule et le mme nom. ToString doit renvoyer toutes les proprits spares par des virgules. Crer une classe Commercial en drivant la classe Salarie. Cette classe aura 2 proprits supplmentaires pour calculer la commission : chiffre d'affaire commission en % chiffreAffaire commission double int

Crer les deux constructeurs standards de la classe Commercial. Ne pas oublier d'appeler les constructeurs quivalents de la classe de base. Crer les mthodes d'accs aux proprits supplmentaires. Surcharger la mthode CalculerSalaire pour calculer le salaire rel (fixe + commission). Surcharger les autres mthodes de la classe de base pour lesquelles on jugera ncessaire de faire ainsi.

Tester les classes Salarie et Commercial

HARCHI Abdellah

Page 16 sur 21

Support de cours POO C# (TDI 1re Anne 2011-2012)

T.P. N5 LES COLLECTIONS


5.1

OBJECTIFS

Tableaux statiques ArrayList Dictionnaire Hashtable Dictionnaire tri SortedList

5.2
5.2.1

CE QU'IL FAUT SAVOIR


Les tableaux statiques

Les tableaux contiennent des lments, chacun d'eux tant repr par son indice. En C#, il existe une manire trs simple de crer des tableaux "classiques" sans faire rfrence aux classes collections : int[] aTab = new int[20]; for (int i = 0; i < 20; i++) { aTab[i] = i + 1900; } String[] aStr = new String[5]; aStr[0] = "Andr"; aStr[1] = "Mohamed"; aStr[2] = "Marc"; aStr[3] = "Francis"; aStr[4] = "Paul"; Salarie[] aSal = new Salarie[5]; aSal[0] = new Salarie(16, 1, 10, "CAUJOL", 10900.00); aSal[1] = new Salarie(5, 1, 10, "DUMOULIN", 15600.00); aSal[2] = new Salarie(29, 3, 20, "AMBERT", 5800.00); aSal[3] = new Salarie(20, 2, 20, "CITEAUX", 8000.00); aSal[4] = new Salarie(34, 2, 30, "CHARTIER", 7800.00); Le problme de ce type de tableaux rside en deux points : Tous les lments du tableau doivent tre de mme type. Le nombre d'lments que peut contenir un tableau est limit au moment de la dclaration. Cela sous-entend que le programmeur connat, au moment de l'criture du programme, le nombre maximum d'lments que doit contenir le tableau.

Itration dans le tableau foreach ( intVal in aTab) { Console.WriteLine(intVal); } 5.2.2 Classe ArraysList C'est un tableau dynamique auquel on peut rajouter ou insrer des lments, en supprimer. Il faut utiliser le namespace System.Collections : using System.Collections; ArrayList al = new ArrayList(); al.Add(1) ; al.Add(45) ; al.Add(87) ; al.Remove(1) ; etc etc Quelques mthodes de la classe ArrayList Mthodes ou proprits Capacity Count Add(object) Remove(object) RemoveAt(int) Insert(int, object) Clear() Contains(object) al[index] But Dtermine le nombre d'lments que le tableau peut contenir Donne le nombre d'lments actuelleent dans le tableau Ajoute un lment au tableau Enlve un lment du tableau Enlve un lment l'indice fourni Insre un lment l'indice fourni Vide le tableau Renvoie un boolen vrai si l'objet fourni est prsent dans le tableau Fournit l'objet situ la valeur de index

Explorer le tableau foreach ( int obj in al) { Console.WriteLine(obj); }

HARCHI Abdellah

Page 17 sur 21

Support de cours POO C# (TDI 1re Anne 2011-2012) Accs un lment du tableau Console.WriteLine("deuxime lment " + al[1]); 5.2.3 La classe Hashtable Hashtable a un comportement analogue un tableau associatif. C'est un dictionnaire. Chaque objet dans C# possde une valeur permettant de l'identifier de faon unique; c'est son hashcode. Une mission de la classe Object est de s'assurer que tout Objet a un hashcode diffrent. A chaque instanciation, C# calcule un hashcode unique pour l'objet qu'il vient de crer. Exemple un dictionnaire contenant des objets de la classe Client : Objet Clef Objet valeur Numero client 1 Objet client 1 Numero client 2 Objet client 2 Les dictionnaires (ou Map) contiennent des lments, chacun d'eux tant repr par une clef. En C#, les dictionnaires peuvent tre implments par la classe Hashtable. ou la classe SortedList Ne pas oublier de faire rfrence au namspace System.Collections Instanciation d'un objet Hashtable Hashtable dict = new Hashtable(); Insrer par Add dict.Add(1,"Toto") ; dict.Add(2,"Titi") ;. Nombre d'lments du dictionnaire proprit Count dict.Count Slectionner un lment variable = dict[1] Supprimer un lment dict.Remove(cl) vider le dictionnaire dict.Clear(); explorer les cls et les valeurs foreach ( int i int dict.Keys) foreach ( string str in dict.Values) Le dictionnaire Hashtable ne trie pas les lments et les restitue dans l'ordre inverse du stockage 5.2.4 SortedList

SortedList est un dictionnaire qui garantit que les cls sont ranges de faon ascendante. Exemple: static void Main() { SortedList sl = new SortedList(); sl.Add(32, "Java"); sl.Add(21, "C#"); sl.Add(7, "VB.Net"); sl.Add(49, "C++"); Console.WriteLine("Les lments tris sont..."); Console.WriteLine("\t Cl \t\t Valeur"); Console.WriteLine("\t === \t\t ====="); for(int i=0; i<sl.Count; i++) { Console.WriteLine("\t {0} \t\t {1}", sl.GetKey(i), sl.GetByIndex(i)); } } Mthodes ou proprits Keys Values Count Add(object key, object value) Remove(object key) RemoveAt(int) But Collection des cls de la liste trie Collection des valeurs ( objets ) de la liste Donne le nombre d'lments actuelleent dans la liste Ajoute un lment la liste ( paire cl-valeur ) Enlve un lment e la liste dont la valeur correspond la cl Enlve un lment l'indice fourni

HARCHI Abdellah

Page 18 sur 21

Support de cours POO C# (TDI 1re Anne 2011-2012) Clear() ContainsKey(object key) ContainsValue(object value) GetKey(int index ) GetByIndex( int index) IndexOfKey( object key) IndexOfValue( object value) 5.3 TRAVAIL A REALISER Tester quelques mthodes sur les diffrentes collections : ArrayList, Hashtable, SortedList Vide la liste Renvoie un boolen vrai si la cl fournie est prsent dans la liste Renvoie un boolen vrai si la valeur fournie est prsent dans la liste Renvoie la cl correspondant l'indice spcifi Renvoie la valeur correspondant l'indice spcifi Renvoie l'indice correspondant une cl Renvoie l'indice correspondant une valeur

A partir de la classe Salarie implmente dans les T.P. prcdents, dans la fonction Main de l'application, Crer une instance d'une collection SortedList dans laquelle on va ranger des instances de la classe Salarie repres par leur numro de matricule. Crer au moins cinq instances de la classe Salarie et les insrer dans la collection. Faire l'itration de la collection pour afficher son contenu par ordre croissant des numros de matricules. Chercher un salari dans la collection en fournissant son matricule

HARCHI Abdellah

Page 19 sur 21

Support de cours POO C# (TDI 1re Anne 2011-2012)

T.P. N 6 - POLYMORPHISME
6.1

OBJECTIFS

Polymorphisme Fonctions virtuelles Classes gnriques

6.2
6.2.1

CE QU'IL FAUT SAVOIR


Polymorphisme

Considrons l'exemple suivant. Salarie sal = new Commercial(7, 2, 10, "PEDROL Jean", 8000.00,45000.00, 12); string str = sal.CalculerSalaire(); La variable sal est dclare de type Salarie, mais elle est instancie partir de la classe Commercial. Une telle affectation est correcte et ne gnre pas d'erreur de compilation. La question que l'on doit se poser maintenant est la suivante : lors de l'envoi du message calculSalaire sal, quelle est la mthode qui va tre excute ? La mthode calculSalaire de la classe Salarie qui calcul le salaire uniquement partir du salaire de base, ou la mthode calculSalaire de la classe Commercial qui prend en compte les proprits commission et chiffre d'affaire de la classe Commercial ? Un simple test va permettre de mettre en vidence que c'est bien la mthode calculSalaire de la classe Commercial qui est excute. C# sait et se souvient comment les objets ont t instanci pour pouvoir appeler la bonne mthode. En Programmation Oriente Objet, c'est ce que l'on appelle le concept de Polymorphisme. Pour toutes les instances de salari, quelles soient instancies partir de la classe de base Salarie ou d'une classe drive comme Commercial, il faut pouvoir calculer le salaire. C'est le comportement polymorphique. Par contre le calcul ne se fait pas de faon identique pour les salaris normaux et les commerciaux. 6.2.2 Mthodes virtuelles

L'ambigut est leve du fait que la rsolution du lien (entre le programme appelant et la mthode) ne se fait pas au moment de la compilation, mais pendant l'excution en fonction de la classe qui a t utilise pour l'instanciation. On parle de mthode virtuelle. calculSalaire est une mthode virtuelle qui dfini un comportement polymorphique sur la hirarchie de classe construite sur Salarie. Pour associer un comportement polymorphique une mthode, il suffit de "surcharger" la mthode la classe de base, avec exactement la mme signature, c'est--dire le mme nom, le mme type de rsultat, le mme nombre de paramtres, de mmes types, dans le mme ordre. La classe racine Object est elle-mme un polymorphisme. Les mthodes Finalize, ToString et Equals, surcharges dans les T.P. prcdents pour les classes Salarie et Commercial, sont des fonctions virtuelles qui dfinissent un comportement polymorphique pour toutes les classes drives de Object. 6.2.3 Classes gnriques

Dans certains cas, lors de l'laboration d'une hirarchie de classe ayant un comportement polymorphique, il peut tre intressant de mettre en facteur le comportement commun plusieurs classes, c'est--dire crer une classe gnrique. Il est probable que le fait de crer une instance de cette classe ne correspond pas une ralit au niveau conceptuel. C'est le cas de la classe racine Object : Il est absurde de crer une instance de la classe Object qui, par ailleurs, dfinit le comportement commun toutes les classes C#. C'est le cas galement de la classe Dictionary qui dfinit le comportement commun toutes les classes dictionnaire, mais qui ne peut tre instancie. Une telle classe est dclare abstract : abstract public class Dictionary { // Dfinitions des membres de la classe } Essayer d'instancier une classe abstract avec l'instruction new va gnrer une erreur de compilation. 6.3 TRAVAIL A REALISER Modifier la fonction Main dveloppe dans le T.P. prcdent en insrant quelques instances de la classe Commercial dans la liste trie. Vrifier le fonctionnement du Polymorphisme li la fonction CalculerSalaire.

HARCHI Abdellah

Page 20 sur 21

Vous aimerez peut-être aussi