Vous êtes sur la page 1sur 130

Programmation Oriente Objet (POO)

A.ELmagri

21/03/2013

PLAN
Introduction la POO (Classes et Objets) Programmation Objet C#
Les Classes en C# Encapsulation et Mthodes daccs Hritage Classes de collections Polymorphisme Les exceptions

A.ELmagri

21/03/2013

Dfinition
Programmation oriente objet (ou POO):
Technique visant faire interagir des objets entre eux, Facilite lcriture des applications par une structuration

en terme dobjets. Favorise la rutilisation de code, en composant des programmes partir dobjets existants (par exemple, la bibliothque standard de C++, de Java, . . .).

A.ELmagri

21/03/2013

Concepts clefs de la POO


Deux notions essentielles sont caractristiques de la POO : Classe : schmatiquement, une classe reprsente le type dun objet, tout comme int reprsente un entier. Objet : constitu par lassociation dune quantit dinformation organise en champs (nom, prnom, age, notes pour un tudiant ; marque, modle, cylindre, vitesse pour une voiture) et dun ensemble de mthodes permettant dinteragir avec lui (calculer la moyenne dun tudiant ou acclrer pour une voiture).

A.ELmagri

21/03/2013

Objet
Objet = identit + tat + comportement Une identit
deux objets diffrents ont des identits diffrentes on peut dsigner lobjet (y faire rfrence)

Un tat (attributs) Ensemble de proprits/caractristiques dfinies par des valeurs Permet de le personnaliser/distinguer des autres objets Peut voluer dans le temps
Un comportement (mthodes)
Ensemble des traitements que peut accomplir un objet (ou que lon peut lui

faire accomplir)

A.ELmagri

21/03/2013

Objet - Exemples
Objet Etat Comportement

Chien Compte Tlphone

Nom, race, ge, couleur.. N, type, solde.. N, marque, sonnerie, rpertoire, oprateur

Aboyer, chercher le bton, mordre.. Retrait, virement, dpt, consultation de solde Appeler, Prendre un appel, Envoyer sms, charger

A.ELmagri

21/03/2013

Classes et instances (1)


Classe = patron/moule (= type)
une classe est la description dune collection objets homognes (mmes

caractristiques et mmes comportements). dcrit la structure de ltat (les attributs et leurs types)
Instance = objet obissant un patron

un objet est une instance de classe. Par analogie, on peut aussi considrer une classe comme le type dune

variable et lobjet comme la valeur de cette mme variable.

Classe : abstrait
la notion/le type Chat

Instance : concret
ce Chat blanc que je vois dans la rue, le chat de mon voisin

A.ELmagri

21/03/2013

Classes et instances (2)


Une classe doit ncessairement comporter les lments suivants : Les champs : ce sont les variables permettant, en gnral, de dfinir ltat de lobjet. Un ou plusieurs constructeurs : ce sont des fonctions indiquant de quelle faon lobjet doit tre dclar et initialis. Les mthodes : ce sont les fonctions permettant dagir sur les objets dune classe. Selon leur dfinition, elle peuvent sappliquer sur un objet particulier, ou sur lensemble des instances dune classe.

A.ELmagri

21/03/2013

Exemples
La classe chien dfinit:
Les attributs dun chien (nom, race, couleur, ge)
Les comportements dun chien (Aboyer, chercher le bton, mordre)

Il peut exister dans le monde plusieurs objets (ou instances) de chien!!


Classe Instances (Objets)

Chien
Compte

- Mon chien: Bill, Teckel, Brun, 1 an - Le chien de mon voisin: Hector, Labrador, Noir, 3 ans
-Mon compte vue: N 210-1234567-89, Courant, 1.734 DZ,12.500DZ -Mon compte pargne: N 083-9876543-21, Epargne, 27.000 DZ, 0DZ

A.ELmagri

21/03/2013

Programmation Objet C#

10

A.ELmagri

21/03/2013

Espace de nom (namespace)


Un espace de nom est un ensemble de classes associes, il peut galement contenir dautres espaces de nom. Exemple : namespace MesClasses { public class ClasseUne { ... } public class ClasseDeux { ... } }

11

A.ELmagri

21/03/2013

Imbrication des espaces de noms


L'imbrication des espaces de noms est possible :

namespace MesClasses { namespace Calcul { // espace de nom MesClasses.Calcul } } Ou directement : namespace MesClasses.Calcul { ... // espace de nom MesClasses.Calcul }
12 A.ELmagri 21/03/2013

Espace de noms en plusieurs parties


Plusieurs fichiers sources peuvent contribuer ajouter des dclarations un mme espace de noms. Fichier : images.cs using System; namespace Exemple.Images { public class Image { ... } public class ImageBitmap : Image { ... } ... } Fichier : couleurs.cs using System; namespace Exemple.Images { public class Couleur { ... } public class ConversionCouleur { ... } ... }
13 A.ELmagri 21/03/2013

Directive using
Le mot cl using fait rfrence aux ressources dans la librairie des

classes de .NET Framework C# est fourni avec de nombreuses classes dutilitaires qui effectuent diverses oprations utiles Ces classes sont organises en espace de nom (namespace) Une directive using spcifie un espace de nom qui sera utilis

14

A.ELmagri

21/03/2013

Les variables et les constantes


Une variable rserve une place en mmoire pour stocker

des donnes. Dclaration: type nom [ = expression ] ;


Une constante nomme est associe une valeur pour

toute la dure de l'application. Sa valeur ne peut changer. Dclaration: const type nom = expression ;
A.ELmagri 21/03/2013

15

Votre premier Programme en C#

16

A.ELmagri

21/03/2013

Les Entres / Sorties (In/Out)


La classe Console

- La classe Console fournit un accs lentre standard, la sortie standard et aux flux derreur standard - Les mthodes Console.Write et Console.WriteLine affichent des informations sur lcran de la console. -Les mthode Console.Read et Console.ReadLine lisent lentre de lutilisateur sur le clavier. Appeler ReadKey la fin de la mthode Main empche que la fentre de console ne se ferme avant que vous ayez pu lire la sortie lorsque vous lancez le mode dbogage en appuyant sur F5.

17

A.ELmagri

21/03/2013

La mthode Main
Lexcution dune application C# dmarre au niveau de la

mthode Main. Une application C# peut contenir plusieurs classes, mais un seul point dentre. On peut avoir plusieurs classes avec Main dans la mme application, mais une seule mthode Main est excute. La classes utiliser doit tre spcifie lors de la compilation de lapplication.

18

A.ELmagri

21/03/2013

La mthode Main
Dclarez la mthode Main d'une des manires suivantes :
Elle peut retourner void :
Elle peut galement retourner int : Avec les deux types de retour, elle peut accepter des arguments :

Le paramtre de la mthode Main est un tableau string qui reprsente les arguments de la ligne de commande utiliss pour appeler le programme.

19

A.ELmagri

21/03/2013

Classe

Classe : Dans C#, une application est une collection dune ou plusieurs classes, structure de donnes et autres types. Les classes peuvent tre rparties dans un ou plusieurs fichiers Plusieurs classes peuvent tre places dans un fichier Membres d'une classe: Les fonctions, appeles mthodes, traitent les donnes, appellent d'autres mthodes, retournent ventuellement une valeur ; Les variables, appeles attributs, stockent les donnes ;

20

A.ELmagri

21/03/2013

Exemple de Classe:
Public class Rectangle { //Les attributs (ou proprietes ou Etat) de la classe Int largeur ; Int longueur ; //Implmentation des methodes (comportement) Int Calcule_surface( ) { Return (largeur*longueur) ; } }

21

A.ELmagri

21/03/2013

Instanciation dun objet


Pour quun objet ait une existence, il faut quil soit instanci.

Une mme classe peut tre instancie plusieurs fois, chaque

instance (objet) ayant des proprits ayant des valeurs spcifiques. Par exemple linstanciation dun objet de type Client se fait comme suit :
Public static void Main(String[] args) { Rectangle rect ; //dclaration dune variable de type Classe rect = new Rectangle( ) ; //instanciation dun objet rectangle }

22

A.ELmagri

21/03/2013

I.

Encapsulation - Mthodes daccs - Constructeurs

23

A.ELmagri

21/03/2013

Encapsulation
Mcanisme permettant de rassembler les attributs et mthodes propres

un type donn afin den restreindre laccs et/ou den faciliter lutilisation et la maintenance De manire gnrale, les donnes sont prives et les mthodes sont publiques Certaines mthodes peuvent tre prives et ne servir quau fonctionnement interne de la classe public : Accs autoris tous ; private : Accs depuis la classe seulement ; Protected : Accs depuis la classe et ses sous-classes seulement ; Si laccs un attribut de classe nest pas dfini, le compilateur C# le considrera par dfaut comme priv
24 A.ELmagri

21/03/2013

Les mthodes daccs aux proprits


Si les proprits sont verrouilles (dclares private) on ne peut plus y accder de lextrieur de la classe. Il faut donc crer des mthodes pour avoir accs aux proprits, ces mthodes doivent permettre un accs dans les deux sens : Les Accesseurs/Setters : Pour modifier la valeur de proprit. Les mutateurs/Getters: Pour connaitre la valeur de la proprit.

25

A.ELmagri

21/03/2013

Les accesseurs (getters) :


Ces mthodes sont appeles des mthodes de type Get, cette

mthode (fonction) ne prend pas de paramtre et retourne la valeur de lattribut associ.

Par exemple pour lattribut largeur de type int , la fonction Get

serait dclar comme suit : Public int GetLargeur() { return largeur; } Cette fonction pourra tre utilise dans la fonction Main comme suit : Rectangle rect = new Rectangle () ; Int large= rect.GetLargeur() ;
A.ELmagri

26

21/03/2013

Les mutateurs/Setters
Ces mthodes sont appeles mthodes Set. Cette mthode na

aucun retour (procdure). Par contre un paramtre de mme type que la proprit doit lui tre indiqu. Le Setter associ la proprit Largeur de la classe Rectangle sera implment comme suit public void SetLargeur (int large){ largeur = large; } Cette fonction pourra tre utilise dans la fonction Main , comme suit : Rectangle rect = new rectangle( ) ; rect.SetLargeur(20);

27

A.ELmagri

21/03/2013

Exemple:
Public Class Rectangle {
/* Letat de la classe les attributs*/

private int largeur; Private int longueur;


/* les getters et setters des attributs */

public void SetLongueur (int long) { this.longueur = long;} public int GetLongueur () { return this.longueur; } public void SetLargeur (int large) { this.largeur = large; } public int GetLargeur () { return this.largeur; }
/* Eventuellement autres mthodes*/

.; }

28

A.ELmagri

21/03/2013

Les Constructeurs(1)
Un constructeur dune classe intervient au moment de linstanciation dun objet de type cette mme classe. Le constructeur initialise les attributs (proprits) de cet objet pour quil soit cohrent. Le constructeur est une mthode de la classe, mais trs particulire :
Parce quelle a le mme nom que lidentificateur de la

classe. Parce quelle na pas de type de retour, mme le type void.

29

A.ELmagri

21/03/2013

Les Constructeurs(2)
Pour une classe donne, on peut dfinir plusieurs

constructeurs. Tous ces constructeurs partagent le mme nom (le nom de la classe), mais se distinguent par le nombre et les types darguments, cette distinction sappelle en oriente objet surcharge. Constructeur dinitialisation :ce constructeur initialise les proprits de lobjet au moment de linstanciation, par les valeurs passes en paramtre.

30

A.ELmagri

21/03/2013

Constructeur / Exemple
Public class Client { //Dclaration des attributs Private int num ; Private string nom ; Private double chiffre_affaire ;
//Implmentation dun constructeur dinitialisation

Public Client(int numero, string name, double ca){ This.num=numero ; This.nom=name; This.chiffre_affaire=ca; } } Cela va permettre dinstancier la classe Client dans Main de la faon suivante : Client cli = new Client(100, toto, 10000);
31 A.ELmagri 21/03/2013

Constructeur par dfaut


Un constructeur par dfaut existe dj pour chaque classe

si aucun autre constructeur nest dclar. A partir du moment o le constructeur dinitialisation existe, il devient impossible dappeler le constructeur par dfaut.
/* faux , impossible dappeler le constructeur par daut*/ Client cli = new Client () ;

Pour remdier ce problme, il suffit de rajouter le

constructeur par dfaut dans la classe Client:


/* constructeur par dfaut */ Public Client ( ) { }

32

A.ELmagri

21/03/2013

Constructeur de recopie
Le constructeur de recopie permet de copier les proprits dun objet existant dans une nouvelle instance(objet). Exemple de constructeur de recopie : public Client (Client c) { This.num = c.num ; This.nom = c.nom; This.chiffre_affaire = c.chiffre_affaire; } Dans le programme principal: cl1t=new Client(234, toto , 9876) ; Client clt2=new Client(clt1) ; //Constructeur de recopie
33 A.ELmagri 21/03/2013

Proprit de classe
En C#, chaque classe peut avoir un compteur dinstance qui

a comme valeur le nombre dinstances en cours, instancies partir de cette classe un moment donne. Ce compteur dinstance est une proprit de classe, sa valeur est la mme pour toutes les instances, pour dclarer cette proprit on utilise le mot static. La proprit de la classe doit tre initialise par 0 lors de sa dclaration, et incrmente de 1 dans tous les constructeurs de la classe.

34

A.ELmagri

21/03/2013

Proprit de classe: Exemple


Public class Client { //proprit de classe private static int compteur=0 ; //proprit dinstance private int num ; Private string nom ; private double ca ; //constructeur par dfaut public Client() { compteur+=1 ; } //Constructeur dinitialisation public Client(int num, string nom, double ca) { compteur+=1 ; This.num=num ; This.nom=nom ; This.ca=ca ; } //Constructeur de recopie Public Client(Client clt) { compteur+=1 ; This.num=clt.num ; This.nom=clt.nom ; This.ca=clt.ca; } }

35

A.ELmagri

21/03/2013

Les mthodes de classe


Une mthode de classe est une mthode private dclare avec le

mot cl static . Exemple : Mthode Get associe la proprit de classe compteur: private static int GetCompteur(){ Return compteur ; } Lappel dune mthode de classe est sensiblement diffrent lappel des autres mthodes. Public static void Main(string[]args){ // utilisation de la classe elle-mme, et pas une instance int cpt= Client.GetCompteur(); }

36

A.ELmagri

21/03/2013

Exemple: Classe Personne


public class personne{
// Attributs de la classe public personne(personne P){
// Incrementer le nbre dinstance

private static long nbPersonnes=0;


// Attributs dobjet

private String _prenom; private String _nom; private int _age; // Constructeurs

nbPersonnes++; this._prenom=p._prenom; this._nom=p._nom; this._age=p._age; }


// Mthode de la classe

public personne(String p, String n, int age) {


// Incrementer le nbre dinstance

public static long GetNbPersonnes{ return _nbPersonnes; }


/* setters et getters */ . }

nbPersonnes++; this._prenom=p; this._nom=n; this._age=age; } }


37 A.ELmagri

Dans la mthode Main: public static void Main(){ personne p1=new personne("Jean","Dupont",30); personne p2=new personne(p1); new personne(p1); Console.Out.WriteLine("Nombre de personnes cres : "+personne.nbPersonnes); }

21/03/2013

Classe statique
Une classe statique ne contient que des membres statiques, et ne peut tre instancie. Le mot cl static prcde la dclaration de cette classe.
Exemple : public static class UneClasseStatique{ public static void Afficher(string message)
{

// ... } } Utilisation : UneClasseStatique.Afficher("Un exemple de message");

38

A.ELmagri

21/03/2013

II. LHritage

39

A.ELmagri

21/03/2013

Cest quoi lHritage ?(1)


Imaginons que nous avons les classes suivantes: Etudiant, Enseignant, Salarie. Nous remarquons que les champs nom, prenom, age ainsi que leurs getters et setters sont rptes dans les 3 classes !! Salarie Etudiant Enseignant
String nom String prenom Int age Int cne getNom() getPrenom() getAge() getCne() String nom String prenom Int age Int matricule String etablissement String nom String prenom Int age Int matricule getNom() getPrenom() getAge() getMatricule

getNom() getPrenom() getAge() getMatricule

40

A.ELmagri

21/03/2013

Cest quoi lHritage ?(2)


De mme, la classe Enseignant et la classe Salarie partagent 4 champs ( matricule de plus!).

Afin d'viter la rptition des lments constituant chacune des classes, il est prfrable de factoriser toutes ces caractristiques communes pour en faire une nouvelle classe plus gnraliste. Personne
On peut penser une classe Personne:
Cette classe contiendra les champs et les mthodes communs de classes Enseignant, Salarie, et Etudiant.
41 A.ELmagri

String nom String prenom Int age GetNom() GetPrenom() GetAge() ..


21/03/2013

Cest quoi lHritage ?(3)


Ainsi Etudiant, Salarie et Enseignant ne sont que des exemples particuliers de Personne! Et qui Hritent tous les caractristiques de la Personne.
Personne Nous remarquons que les attributs encapsuls dans la classe Personne, ne figurent plus dans les trois classes Drives /FILLES
String nom String prenom Int age GetNom() GetPrenom() GetAge() ..

Classe Parente (Mre)


On dit que la classe Salarie Hrite de la classe Personne ( elle hrites tous les attributs et les mthodes)

Etudiant
Int cne getCne()
42 A.ELmagri

Enseignant Int matricule String etablissement getMatricule () getEtablissement()

Salarie Int matricule getMatricule() 21/03/2013

Nous remarquons aussi, que Enseignant est en fait un Salarie, et que la caractristique Matricule est en commun, donc on peut penser faire une liaison dhritage entre Salarie et Enseignant comme suit:
Personne
String nom String prenom Int age
GetNom() GetPrenom() GetAge() .. Salarie Int matricule getMatricule()

Etudiant
Int cne Enseignant
String etablissement getEtablissement() 43 A.ELmagri 21/03/2013

getCne()

Pour rcapituler !
Lhritage consiste en la cration dune nouvelle classe dite classe drive ou classe fille partir dune classe existante dite classe de base ou classe parente ou encore classe mre. Lhritage permet de : Rcuprer le comportement standard dune classe objet (classe mre) partir de proprits et de mthodes dfinies dans celle-ci. Ajouter des fonctionnalits supplmentaires en crant de nouvelles proprits et mthodes dans la classe drive. Modifier le comportement standard dune classe dobjet (classe mre) , en surchargeant certaines mthodes de la classe mre dans la classe drive.

44

A.ELmagri

21/03/2013

Classe fille Classe Parente


Classe Fille
Classe Mre class ClasseA { public int dataA; public int MethodeA1() { // coprs de la mthode } //Mthode surchargeable public virtual int MethodeA2() { /*coprs de la mthode */ } }
45 A.ELmagri

Class ClassB : ClassA{ public int Dtab ; /* Redfinition de la methodeA2 */ public override int MethodeA2(){ //code de la mthode } public int MethodeB1(){ //coprs de la mthode } }

21/03/2013

Classe Fille /Classe Parente :


Dans lexemple prcdent : 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. dtab est une proprit de la classe ClasseB (mais pas de ClasseA). MethodeA1 est une mthode de la classe ClasseA. Par hritage, c'est aussi une mthode de la classe ClasseB. MethodeB1 est une mthode de la classe ClasseB (mais pas de ClasseA). MethodeA2 est une mthode des classes ClasseA et ClasseB. Dans la classe A, MethodeA2() est dclare virtual car elle est surchargeable dans la classe B Dans la classe B, MethodeA2 est dclare override car elle remplace la mthode de la classe A

46

A.ELmagri

21/03/2013

Le mot clef Protected


Mme si les classes Enseignant et Salarie sont trs proches de la classe Personne, le fait que les champs dfinis dans Personne le soit avec le mot clef private les oblige utiliser les proprits pour accder. Il existe un autre mot clef permettant laccs des champs dune classe ses classes lles : protected. Cela reviendrait dfinir la classe Personne de la manire suivante :
public class Personne {//Champs protected string nom; protected string prenom; protected int age; protected int telephone; }

Retenez surtout que protected permet laccs au champs uniquement aux classes-filles de Personne,

47

A.ELmagri

21/03/2013

Constructeurs
Contrairement aux mthodes, champs et proprits, une classe lle nhrite pas des

constructeur de sa classe mre. Les constructeurs doivent donc tre redfinis. On peut cependant faire appel aux constructeurs de la classe mre: public Enseignant(string nom, string prenom, int age, int tel, int matricule, string etablissement) :base(nom, prenom, age, tel) { this. matricule= matricule; this.etablissement = etablissement ; }
Le mot clef base appelle le constructeur correspondant de la classe Personne.

Si lappel par le mot clef base est absent, alors le compilateur va se tourner vers un constructeur sans paramtre de Personne, (qui doit tre pralablement dfinis) et renverra une erreur si ce constructeur nexiste pas. Retenez bien quun objet Enseignant est aussi une Personne et doit donc tre instanci comme une Personne avant de pouvoir tre dclar comme un Enseignant.

48

A.ELmagri

21/03/2013

Mthodes

Certaines mthodes dune classe mre peuvent ne plus tre adapte sa/ses classe(s) lle(s). Il faut alors redfinir la mthode en question. Par exemple, la mthode AfficherPersonne() de la classe Personne ne permet pas de rendre compte de lensemble des informations prsentes dans la classe Enseignant. Il faut donc la complter de la manire suivante :
public void AfficherPersonne() { string s = base.AfficherPersonne() + "," + this.matricule + "," + this.etablissement; Console.WriteLine(s); } On aurait tout aussi bien crire cette mthode de la faon suivante :

public void AfficherPersonne() { string s = this.prenom + "," + this.nom + ", + this.age + "," + this.tel + "," + this.matricule+ "," + this.etablissement ; Console.WriteLine(s);
}

49

A.ELmagri

21/03/2013

Classe abstraite(1)
Comment implmenter les mthodes primtre() et surface()

dans la classe Forme ? Les deux mthodes ne peuvent pas tre implments dans la dclaration de la classe Forme. Car La formule de calcul change dune forme lautre !! Donc faut juste dclarer les signatures de 2 mthodes dans la classe Forme de la faon suivantes: abstract public double Calcul_surface(); abstract Public double Calcul_Perim(); Les 2 mthodes seront par la suite implmentes dans chaque classe fille De faons diffrentes.
50 A.ELmagri 21/03/2013

Classe abstraite(2)
On dit que la classe Forme est une classe Abstraite, car elle

contient au moins une mthode abstraite. Une classe abstraite ne peut pas tre instancie ! Les mthodes abstraites doivent obligatoirement tre implments dans les sous classes de la classe abstraite. abstract public Class Form { private string nom; public Forme (string nom) { this.nom = nom; } abstract public double Calcul_perim(); public void dessiner() { /*corps de la mthode */ } }
51 A.ELmagri 21/03/2013

Classe abstraite (3)


La classe fille Cercle:
Public Class Cercle : Form { private double rayon;

La classe fille Rectangle:


Public Class Rectangle: Form { private double long; private double large; /*constructeur */ public rectangle (double long, double large) : base(nom) { this.long = long; this.large = large; } /* implmentation de la mthode abstraite */ public double calcul_perim() { return 2*(large + long) ; } }
21/03/2013

/*constructeur */
public Cercle (double rayon) : base(nom) { this.rayon = rayon; }
/* implmentation de la mthode abstraite */

public double calcul_perim() { return 2*Double.PI*this.rayon; }

52

A.ELmagri

La mthode ToString()(1)
La mthode ToString est une mthode hrite de la super-classe

Class Rectangle { private int largeur ; private int longueur ; public Rectangle(){ } public Rectangle(int largeur , int longueur){ this.largeur=largeur ; this.longueur=longueur ; } ..}
53 A.ELmagri

Object , Le prototype de la mthode ToString est le suivant : public String ToString() ; la mthode ToString: permet de convertir un objet de type classe en String. Public static void Main(string[]args){ Exemple : Rectangle r=new Rectangle(3,4) ;
Console.WriteLine(r= + r); /* faux, impossible dafficher lobjet r, parce quon a pas surcharg la fonction ToString dans la classe Rectangle */ }

21/03/2013

La mthode ToString() (2)


Pour remdier ce problme, on doit surcharger ( redfinir) la fonction ToString dans la classe Rectangle.

La classe Rectangle aprs modification : Class Rectangle{ Private int largeur ; Private int longueur ;
/* les constructeurs */ /* La mthode ToString */

Public static void Main(string[]args){ Rectangle r = new Rectangle(3,4) ; Console.WriteLine(r= + r);


// cest OK, et a va afficher (3,4) }

Public override String ToString(){ Return ((+ this.largeur + , + this.longueur + )); } }

54

A.ELmagri

21/03/2013

La mthode Equals()
Cette mthode doit rpondre VRAI si deux instances sont

rigoureusement gales. De mme que la mthode ToString La mthode Equals est une mthode virtual hrite de la classe Object, pour quon puisse lutiliser dans nimporte quelle classe on doit la surcharger.
Class Rectangle{ Private int largeur ; Private int longueur ; //le constructeur de recopie Public Rectangle(Rectangle rec){ This.largeur=rec.largeur ; This.longueur=rec.longueur ;} } Public static void Main(string[]args){ Rectangle r1=new Rectangle(3,4) ; Rectangle r2=new Rectangle(r1) ; Boolean a= (r1==r2); /*a va gnrer erreur parce quon peut pas comparer Deux objets en utilisant loprateur == */ }

A.ELmagri
55 A.ELmagri 21/03/2013

Classe Sealed
Une classe Sealed : cest une classe dont on ne peut driver ( ne

peut pas tre une classe mre). C# permet de spcifier quune classe ne peut en aucun cas tre une classe de base. Cest--dire aucune classe ne peut driver de celle-ci. Pour cette raison, elle ne peut pas galement tre une classe abstraite. Il suffit de mettre le mot cl sealed devant la dclaration de la classe Ce type de classe ne peut avoir de mthodes abstraites (abstract) ou de membres protgs (protected) car aucune classe drive ne pourra tre cre pour les implmenter / y accder.

56

A.ELmagri

21/03/2013

Interface
Lorsqu'une classe est dclare en abstract et que toutes ses

mthodes sont dclares en abstract, on appelle en C# une telle classe une Interface. Une interface ne doit contenir aucun champ ou attribut. Une interface doit contenir des mthodes non implmentes. Une interface est hritable. Pour pouvoir construire un objet partir d'une interface, il faut dfinir une classe non abstraite implmentant toutes les mthodes de l'interface. Syntaxe : interface < nom de l'interface > { < corps des dclarations : mthodes, > }

57

A.ELmagri

21/03/2013

Interface : Exemple
interface Ivehicule {
/* Signatures de mthodes de linterface*/

void Demarrer( ); void RpartirPassager( ); void PeriodiciteMaintenance( ); }

58

A.ELmagri

21/03/2013

Les interfaces et l'hritage multiple


Avec l'hritage multiple, une classe peut hriter en mme temps

de plusieurs super classes. Ce mcanisme n'existe pas en c#. Les interfaces permettent de mettre en oeuvre un mcanisme de remplacement. Plusieurs interfaces peuvent tre implmentes dans une mme classe.
class nomClasse : Interface1, Interface2, ...{ //Implementer ici les mthodes des interfaces }

5 9

A.ELmagri

21/03/2013

Les interfaces et l'hritage multiple


Exemple:
Public interface IA{ double CalculerSomme(); } Public interface IB{ double TrouverMax(); }

public class C : IA, IB { double b; double a; public double somme() { return a+b; } public double TrouverMax() { double max ; if (a ) max = a; else max = b; return max; }
6 0 A.ELmagri 21/03/2013

IV. Polymorphisme

61

A.ELmagri

21/03/2013

Polymorphisme ?
Le polymorphisme est un mcanisme via lequel un objet de la classe mre peut prendre plus d'une forme (de ses classes filles).
Par exemple, si vous avez une classe de base nomme Personne, une rfrence de type Personne peut tre utilis pour contenir un objet de n'importe laquelle de ses classes drives ( Salarie, Enseignant ..). Quand vous appelez une mthode partir de votre objet, le systme dterminera automatiquement le type de l'objet afin d'appeler la mthode approprie.

Exemple 1 :
Personne x; Personne cl = new Personne("Ali",42 ); Salarie sal = New Salarie("Ahmed", 23, 3000); x = cl; Console.WriteLine(x.ToString()); x = sal; Console.WriteLine(x.ToString());

62

A.ELmagri

21/03/2013

Exemple2:
/*definir un tableau de vehicules (classe mere) */

Vehicule ve = new Vehicule [3];


/* ici chaque objet de tableau ve prend une forme (de classes filles )*/

Ve[0] = new Voiture (.); Ve[1] = new Camion (); Ve[2] = new Bus ();

63

A.ELmagri

21/03/2013

La Classe String

64

A.ELmagri

21/03/2013

System.String est une classe fondamentale de .NET. Elle est

exclusivement conue pour stocker des chanes de caractres et met disposition du programmeur un grand nombre d'oprations de traitement des chanes string (avec s minuscule) reprsente un raccourci vers le type String (S majuscule) String s = new String(chaine"); // Equivaut string s = chaine";

65

A.ELmagri

21/03/2013

La concatnation :
string msg1 = "Hello"; string msg2 = " World"; msg2 = String.Concat(msg1, msg2); //quivaut msg2 += msg1;

Taille dune chaine


string str = "MaChaine" Console.Write(str.length); 8 Remplacer une chaine Console.Write(str.replace( Ma , Ta )); TaChaine

La comparaison :
string s1 = "hello"; string s2 = "hello"; bool c1 = s1.Equals(s2); //quivaut bool c1 = (s1 == s2);
A.ELmagri

66

21/03/2013

Mthodes de String

67

A.ELmagri

21/03/2013

Mthodes de String (suite)

68

A.ELmagri

21/03/2013

Exemple
public class string1{ // une classe de dmonstration public static void Main(){ string uneChaine="l'oiseau vole au-dessus des nuages"; affiche("uneChaine="+uneChaine); affiche("uneChaine.Length="+uneChaine.Length) ; affiche("chaine[10]="+uneChaine[10]); affiche("uneChaine.IndexOf(\"vole\")="+uneCh aine.IndexOf("vole")); affiche("uneChaine.IndexOf(\"x\")="+uneChain e.IndexOf("x")); affiche("uneChaine.LastIndexOf('a')="+uneChain e.LastIndexOf('a')); affiche("uneChaine.LastIndexOf('x')="+uneChain e.LastIndexOf('x')); affiche("uneChaine.Substring(4,7)="+uneChaine. Substring(4,7)); affiche("uneChaine.ToUpper()="+uneChaine.ToU pper());
69 A.ELmagri

affiche("uneChaine.ToLower()="+uneChaine. ToLower()); affiche("uneChaine.Replace('a','A')="+uneCh aine.Replace('a','A')); string[] champs=uneChaine.Split(null); for (int i=0;i<champs.Length;i++){ affiche("champs["+i+"]=["+champs[i]+"]"); } affiche("Join(\":\",champs)="+System.String .Join(":",champs)); affiche("(\" abc \").Trim() =["+" abc ".Trim()+"]"); } public static void affiche(String msg){ // affiche msg Console.Out.WriteLine(msg); } }

21/03/2013

Aprs excution de lexemple prcdent:


uneChaine=l'oiseau vole au-dessus des nuages uneChaine.Length=34 chaine[10]=o uneChaine.IndexOf("vole")=9 uneChaine.IndexOf("x")=-1 uneChaine.LastIndexOf('a')=30 uneChaine.LastIndexOf('x')=-1 uneChaine.Substring(4,7)=seau vo uneChaine.ToUpper()=L'OISEAU VOLE AU-DESSUS DES NUAGES uneChaine.ToLower()=l'oiseau vole au-dessus des nuages uneChaine.Replace('a','A')=l'oiseAu vole Au-dessus des nuAges champs[0]=[l'oiseau] champs[1]=[vole] champs[2]=[au-dessus] champs[3]=[des] champs[4]=[nuages] Join(":",champs)=l'oiseau:vole:au-dessus:des:nuages (" abc ").Trim()=[abc]
70 A.ELmagri 21/03/2013

Exercice
Ecrire un programme qui supprime toutes les

occurrences dun caractre C dans une chaine Str. Inverser une chaine de caractres. Remplacer le premier caractre de chaque mot dans une phrase par le majuscule.

71

A.ELmagri

21/03/2013

La classe Regex

72

A.ELmagri

21/03/2013

La classe Regex
La classe Regex permet de tester le format d'une chane de

caractres. Ainsi on peut vrifier qu'une chane reprsentant une date est bien au format jj/mm/aa. On utilise pour cela un modle et on compare la chane ce modle. Ainsi dans cet exemple, j m et a doivent tre des chiffres. Le modle d'un format de date valide est alors "\d\d/\d\d/\d\d" o le symbole \d dsigne un chiffre

73

A.ELmagri

21/03/2013

Le symbole \d
Considrons quelques exemples autour du symbole \d qui reprsente 1 chiffre :
Modele \d \d* \d+ \d{2} \d{3,} \d{5,7} Signification 0 ou un chiffre 0 ou davantage de chiffres 1 ou davantage de chiffres 2 chiffres au moins 3 chiffres entre 5 et 7 chiffres

74

A.ELmagri

21/03/2013

Exemples de modles:

une date au format jj/mm/aa : \d{2}/\d{2}/\d{2} une heure au format hh:mm:ss: \d{2}:\d{2}:\d{2}

75

A.ELmagri

21/03/2013

IsMatch
Un objet de type Regex se construit de la faon suivante :

construit un objet partir d'un modle pass en paramtre (pattern) Une fois le modle construit, on peut la comparer des chanes de caractres avec la mthode IsMatch :
public bool IsMatch(string Qui retourne vrai si la chane inputinput) correspond au modle cr.

/*constructeur */ public Regex(string pattern)

76

A.ELmagri

21/03/2013

Exemple: Format dune date


static void Main(string[] args) if (regex1.IsMatch(exmple)){
Console.WriteLine("["+exmple + "] correspond au modle ["+modle1+"]"); } else { Console.WriteLine("[" + exmple + "] ne correspond pas au modle [" + modle1 + "]"); } Console.ReadKey(); }

{// une expression rgulire modle


string modle1 = @"\d{2}/\d{2}/\d{2}"; Regex regex1=new Regex(modle1);
// comparer un exemplaire au modle

string exmple=" 11/02/99 ";

Ne pas oublier : using System.text.RegularExpressions


77 A.ELmagri 21/03/2013

III. Les Classes de collections

78

A.ELmagri

21/03/2013

Les tableaux statiques (1)


Les tableaux contiennent des lments, chacun deux tant repr par son

indice. En C#, il existe une manire trs simple de crer des tableaux classiques , sans faire rfrence aux classes Collections.
//Dclaration Salarie[] sal=new Salarie[5] ; Salarie[0]=new Salarie(16,4,2, "toto ",8765) ; Salarie[1]=new Salarie(8,5,2, "Ali ",6543) ; Salarie[2]=new Salarie(32,4,2, " Farid ",2075) ; Salarie[3]=new Salarie(20,5,3, "Ahmed ",2165) ; Salarie[4]=new Salarie(9,65,2, "Mohamed ",765) ; /* dclaration*/ String[] aStr=new string[5] ; aStr[0]=Ahmed; aStr[1]=Farid; aStr[2]=Ali; aStr[3]=Ibrahim; aStr[4]= Mohamed;

79

A.ELmagri

21/03/2013

Les tableaux statiques (2)


Le problme de ce type de tableau rside en deux points :
Tous les lments du tableau ont le mme type.
Le nombre des lments du tableau est connu au moment de la

dclaration.

Pour afficher tous les lments dun tableau statique tab :


Ce programme stocke chaque fois la valeur dun lment du tableau tab dans la foreach(intVal in tab){ variable intVal , puis affiche cette dernire. Console.WriteLine(intVal) ;} Le mot-clef foreach permet de parcourir des objets. Sa syntaxe est :

foreach (typeDeLelement element in collectionDelements) {/* Code utilisant lelement.*/ }


80 A.ELmagri 21/03/2013

ArrayList (1)
La classe ArrayList: est un tableau dynamique auquel on peut rajouter

ou insrer des lments et en supprimer. Il faut utiliser le namespace: System.Collections


Using System.Collections ; .. /*declaration dun tableau dynamique*/ ArrayList maListe = new ArrayList() ; /* Ajouter un element au tableau*/ maListe.add(1) ; maListe.add(80) ; /* Supprimer un element au tableau*/ maListe.remove(1);
//Afficher le tableau maListe : foreach (int val in maListe ) { Console.WriteLine(val); } // Accs un lment Console.WriteLine(deuxime element + maListe [1]);

81

A.ELmagri

21/03/2013

ArrayList (2)
Quelques mthodes de la classe ArrayList

82

A.ELmagri

21/03/2013

La classe Hachtable
Un objet de type Hashtable: reprsente une collection

de pairs (Key, value).


La cl est le hashcode : lidentifiant de l lment. Valeur : cest la valeur stocke dans llment.

Exemple:
NB : Le dictionnaire Hashtable ne trie pas les lments, et pour avoir un dictionnaire tri dans lordre croissant en fonction de la cl de ses lments, on doit utiliser la classe SortedList ou lieu de la classe Hashtable

83

A.ELmagri

/* Instancier un objet de type Hashtable */ Hashtable dict = new Hashtable() ; /* Insrer un lment par add() */ dict.add(1, toto ) ; dict.add(2, titi ); /* Nombre dlment du dictionnaire */ int nbr=dict.Count() ; /* Supprimer un lment en fonction de sa cl (hashcode) */ dict.Remove(cl) ; /* vider le dictionnaire par Clear() */ dict.Clear() ; //Parcourir le dictionnaire for (int i = 0; i < dict.Count; i++) ou foreach(int i in dict.Keys); 21/03/2013 foreach(string s in dict.values);

La classe SortedList (1)


SortedList est un dictionnaire qui garantit que les cls soient

ranges de faon ascendante (dans lordre croissant). Exemple :


static void Main(){ /* Instancier un objet de type SotedList */ SortedList s =new SortedList() ; /* Ajouter des elements dans s */ s.add(32,"Java"); s.add(21, "C#"); s.add(7, "VB.net"); s.add(49, "C++"); /* afficher le dictionnaire s */ For(int i=0 ; i<s.count ; i++){ Console.WriteLine("cl ="+ s.GetKey(i) + " , valeur= "+ s.GetByIndex(i)); }

84

A.ELmagri

21/03/2013

La classe SortedList (2)


Voici quelques mthodes qui permettent de manipuler un dictionnaire de type SortedList.

85

A.ELmagri

21/03/2013

Exemple simple:
static void Main(string[] args) { Hashtable hash = new Hashtable(); /* Alimenter le dictionnaire hash*/ hash.Add(3, "Casa"); hash.Add(2, "Rabat"); hash.Add(4, "Sale");

foreach (string ville in liste) Console.WriteLine("la ville est : "+ville);

/* affichage de sortedList est trie */ foreach (DictionaryEntry ville in sorted) Console.WriteLine("ville key : " + ville.Key + "ville value : " +ville.Value);
/*l'affichage de hash n est pas trie */ foreach (DictionaryEntry ville in hash) Console.WriteLine("ville key (hash) : " + ville.Key + "Ville value (hash) :" + ville.Value); Console.ReadKey(); }

SortedList sorted = new SortedList(); /* Alimenter le dictionnaire maListeSorted*/ sorted.Add(1, "Casa"); sorted.Add(2, "Rabat"); sorted.Add(3, "Sale");
ArrayList liste = new ArrayList(); /* Alimenter la liste */ liste.Add("Casa"); liste.Add("Rabat"); liste.Add("Sale");

86

A.ELmagri

21/03/2013

Les collections gnriques:


List<T> HashSet<T>

LinkedList<T>
Dictionary<TKey,TValue>

SortedList <TKey,TValue>

87

A.ELmagri

21/03/2013

List<T>
La classe System.Collections.Generic.List<T> permet

d'implmenter des collections d'objets de type T dont la taille varie au cours de l'excution du programme. Un objet de type List<T> se manipule presque comme un tableau. Ainsi l'lment i d'une liste Liste est-il not Liste[i]. Pour un objet List<T> ou T est une classe, la liste stocke l encore les rfrences des objets de type T.

8 8

A.ELmagri

21/03/2013

List<T>
using System.Collections; public static void Main(string[] args) { // creer 4 personnes personne p1 = new personne("nom1", "Ville1"); personne p2 = new personne("nom2", "Ville2"); personne p3 = new personne("nom3", "Ville3"); personne p4 = new personne("nom4", "Ville4"); // creer la liste List<personne> // remplir la liste list.Add(p1); list.Add(p2); list.Add(p3); list.Add(p4); 8 9 A.ELmagri // parcourir la liste 1 ere mthode

"prenom1", 23,

for (int i = 0; i < list.Count; i++) { Console.WriteLine(list[i].ToString()); }


// parcourir la liste 2eme mthode foreach (personne p in list) { Console.WriteLine(p.ToString()); } Console.ReadLine(); }

"prenom2", 24,
"prenom3", 25, "prenom4", 30,

list = new List<personne>();

21/03/2013

HashSet<T>
using System.Collections; public static void Main(string[] args) { // creer 4 personnes personne p1 = new personne("nom1", "prenom1", 23, "Ville1"); personne p2 = new personne("nom2", "prenom2", 24, "Ville2"); personne p3 = new personne("nom3", "prenom3", 25, "Ville3"); personne p4 = new personne("nom4", "prenom4", 30, "Ville4"); // creer la liste HashSet <personne> list = new Hashset <personne>(); // remplir la liste list.Add(p1); list.Add(p2); list.Add(p3); list.Add(p4);

// parcourir la liste 2eme mthode


foreach (personne p in list) { Console.WriteLine(p.ToString()); } Console.ReadLine(); }

9 0

A.ELmagri

21/03/2013

LinkedList<T>
using System.Collections; public static void Main(string[] args) { // creer 4 personnes personne p1 = new personne("nom1", "prenom1", 23, "Ville1"); personne p2 = new personne("nom2", "prenom2", 24, "Ville2"); personne p3 = new personne("nom3", "prenom3", 25, "Ville3"); personne p4 = new personne("nom4", "prenom4", 30, "Ville4"); // creer la liste LinkedList <personne> list = new LinkedList <personne>(); // remplir la liste list.AddLast(p1); list.AddLast(p2); list.AddLast(p3); list.AddLast(p4); // parcourir la liste

foreach (personne p in list) { Console.WriteLine(p.ToString()); }


Console.ReadLine(); }

9 1

A.ELmagri

21/03/2013

Dictionary<TKey,TValue>
using System.Collections; public static void Main(string[] args) { // creer 4 personnes personne p1 = new personne("nom1", "prenom1", 23, "Ville1"); personne p2 = new personne("nom2", "prenom2", 24, "Ville2"); personne p3 = new personne("nom3", "prenom3", 25, "Ville3"); personne p4 = new personne("nom4", "prenom4", 30, "Ville4"); // creer le dictionnaire // pour afficher les cls et les valeurs foreach (String s in dic.Keys) { Console.WriteLine("la cl est : " +s +" la valeur est :"+ dic[s].ToString()()); }

Dictionary<string, personne> dic = new Dictionary<String, personne>();


// remplir le dictionnaire dic.Add(p1.Nom,p1); dic.Add(p2.Nom, p2); dic.Add(p3.Nom, p3); dic.Add(p4.Nom, p4); A.ELmagri

// pour afficher les valeurs foreach (personne p in dic.Values) { Console.WriteLine(p.ToString()()); }

9 2

21/03/2013

SortedList <TKey,TValue>
using System.Collections; public static void Main(string[] args) { // creer 4 personnes personne p1 = new personne("nom1", "prenom1", 23, "Ville1"); personne p2 = new personne("nom2", "prenom2", 24, "Ville2"); personne p3 = new personne("nom3", "prenom3", 25, "Ville3"); personne p4 = new personne("nom4", "prenom4", 30, "Ville4"); // creer le Hashtable // pour afficher les cls foreach (String s in dic.Keys) { Console.WriteLine("la cl est : " +s) ; }

// pour afficher les valeurs foreach (personne p in dic.Values) { Console.WriteLine(p.ToString()); }

SortedList<string, personne> dic = new SortedList<string, personne> ();


// remplir le dictionnaire dic.Add(p1.Nom,p1); dic.Add(p2.Nom, p2); dic.Add(p3.Nom, p3); dic.Add(p4.Nom, p4); 9 3 A.ELmagri 21/03/2013

Exercice
Crer la classe personne qui contient la code, le nom , le prenom , et lage. Crer les constructeurs et les proprits Ecrire la methode getInfo(); Crer une liste qui stocke les personnes Crer la mthode ajouter(personne) qui ajoute une personne la liste. Crer la mthode modifier_nom (code, nom) qui modifie le nom dune personne. Crer la mthode supprimer (nom) qui supprime une personne de la liste. Crer la mthode chercher(code) qui cherche une personne connaissant son code. Crer la mthode affichage() qui liste toutes les personnes. Crer la mthode compter() qui return le nombre des personnes stockes. crer une fonction categories() qui affiche la catgorie de chaque personne ( p si son age <18 ,

j si son age est entre 19 est 35 , et g si son age > 35. Ecrire un menu pour appeler ces fonctions.

9 4

A.ELmagri

21/03/2013

Solution
class personne { int code; String nom; String prenom; int age; // les proprits public int Code { get { return code; } set { code = value; } } public String Prenom { get { return prenom; } set { prenom = value; } } public int Age { get { return age; } set { age = value; } } public String Nom { get { return nom; } set { nom = value; } } // Constructeurs public personne() { } public personne(String nom, String prenom, int age, int code) { this.nom = nom; this.prenom = prenom; this.age = age; this.code = code; 21/03/2013 }

9 5

A.ELmagri

public String getinfo() { return " Je mappelle " + nom + " -- " + Prenom + " Jai + " an j'ai le code " + code; } // dclaration de la liste des personne static List<personne> lis = new List<personne>(); static public void ajouter(personne p) { lis.Add(p); }

" + Age

static public void modifier_nom(int c ,String n) { foreach (personne p in lis) { if (p.code==c) { p.nom = n; } } }

9 6

A.ELmagri

21/03/2013

static

public Personne chercher(int code) {Persone pr = null; foreach (personne p in lis) { if (p.code == code) { pr = p; break; } } return pr; } static public void supprimer( String n) { foreach (personne p in lis) { if (p.nom.Equals(n)) { lis.Remove(p); break; } } }

9 7

A.ELmagri

21/03/2013

static public void affichage() { foreach (personne p in lis) { Console.WriteLine(p.getinfo()); } } static public int compter() { return lis.Count; } static public void categories() { foreach (personne p in lis) { if(p.age<= 18) Console.WriteLine("la catgorie de "+p.nom+ " est :P" ); if (p.age >= 19 && p.age<=35) Console.WriteLine("la catgorie de " + p.nom + " est :J"); if (p.age >= 36) Console.WriteLine("la catgorie de " + p.nom + " est :G"); 9 8 } A.ELmagri } } 21/03/2013

public class test { public static void Main(string[] args) { int c; do { Console.WriteLine("1- pour ajouter"); Console.WriteLine("2- pour afficher"); Console.WriteLine("3- pour modifier"); Console.WriteLine("4- pour supprimer"); Console.WriteLine("5- pour rechercher"); Console.WriteLine("6- pour afficher la gategorie"); Console.WriteLine("7- pour compter"); Console.WriteLine("8- pour quitter");

c = int.Parse(Console.ReadLine());

9 9

A.ELmagri

21/03/2013

switch (c) { case 1: { Console.WriteLine("donner le nom , le prenom, l'age et le code"); String n = Console.ReadLine(); String pr = Console.ReadLine(); int a = int.Parse(Console.ReadLine()); int co = int.Parse(Console.ReadLine()); personne p = new personne(n, pr, a, co); personne.ajouter(p); break; } case 2: personne.affichage(); break; case 3: { Console.WriteLine("entrer le code modifier"); int co = int.Parse(Console.ReadLine()); Console.WriteLine("donner le nouveau nom"); String n = Console.ReadLine(); personne.modifier_nom(co, n); break; } 1 0 A.ELmagri 21/03/2013

case 4:

{
Console.WriteLine("entrer le nom supprimer"); String n = Console.ReadLine(); personne.supprimer(n); break; } case 5: { Console.WriteLine("entrer le code chercher"); int n = int.Parse(Console.ReadLine()); personne.chercher(n); break;

} case 6: personne.categories(); break;

case 7: Console.WriteLine("le nombre des personnes est :" + personne.compter()); break; } } while (c != 8); Console.ReadLine(); } } } 1 0 A.ELmagri 21/03/2013

V. Gestion des Exceptions

102

A.ELmagri

21/03/2013

Problme
Essayons dans ce premier exemple de voir l'effet des erreurs courantes sur le fonctionnement du programme suivant:
class Program { static void Main(string[] args) { int a=10, b=0, c; Console.WriteLine("Avant division"); c = a/b; Console.WriteLine("Aprs division, c vaut " + c); } }
1 0 A.ELmagri 21/03/2013

Problme
Essayons dans ce premier exemple de voir l'effet des erreurs courantes sur le fonctionnement du programme

1 0

A.ELmagri

21/03/2013

Une premire solution


Pour ne pas avoir de problme il suffit de tester les valeurs entres :
public class Program { public static void Main(string[] args) { int a = 10, b = 0, c; Console.WriteLine("Avant division"); if (b == 0) Console.WriteLine("Division par zro"); else { c = a / b; Console.WriteLine("Aprs division, c vaut " + c); } Console.ReadLine(); } }

Le problme pos par cette solution est une augmentation des lignes de code et une complication du programme. De plus, si l'on oublie de tester une valeur, il y aura arrt brutal du programme (bugs de programmes ). 21/03/2013 A.ELmagri
1 0

Une 2me Solution : Try ..Catch


static void Main(string[] args) { try { int a = 10, b = 0, c; Console.WriteLine("Avant division"); c = a / b; Console.WriteLine("Aprs division, c vaut " + c); } catch (DivideByZeroException ex) { Console.WriteLine(ex.Message); } }
1 0 A.ELmagri 21/03/2013

Alors, cest quoi une exception?


Lorsqu'un problme survient au cours de l'excution d'un programme C#, une exception se produit. Les exceptions interrompent le flux du programme en cours et, si rien n'est fait, le programme cesse tout simplement de s'excuter. Une exception constitue souvent un moyen pratique de quitter une section de code qui ne s'applique plus, ou de signaler qu'une mthode a chou ou ne respecte pas certaines rgles de gestion. Exemples: affecter une valeur int un string, un nombre divis par zro, ou entre inattendue (un utilisateur slectionne un fichier inexistant).

107

A.ELmagri

21/03/2013

Capture dune exception :


C# fournit plusieurs mots cls: try, catch et finally qui permettent

aux programmes de dtecter les exceptions, de les grer et de poursuivre l'excution.

Try {//code qui peut gnrer des exception} Catch ( TypeException1 e){//code excut si une Exception1 est dtecte} Catch ( TypeException2 e){//code excut si une Exception2 est dtecte} Finally {//code excut la fin tout le temps }

Le bloc try: contient le code qui effectue les oprations normales du

programme, mais qui risque de rencontrer des erreurs plus ou moins inatendues. Le bloc catch: contient le code de traitement des erreurs qui sont apparues lors de l'excution du programme. Le bloc finally: contient le code que vous voulez imprativement excuter aprs le bloc try ou catch. Ce bloc est excut qu'une exceptions soit leve ou pas !
108 A.ELmagri 21/03/2013

Comment cela fonctionne ?


Le schma de fonctionnement est le suivant : 1- Le flux d'excution entre dans le bloc try 2- S'il n'y a pas d'erreur, on passe directement l'tape 4 3- En cas d'erreur, l'excution se poursuit dans le bloc catch o les erreurs sont gres 4- Le bloc finally est excut

109

A.ELmagri

21/03/2013

Exemple : Try ..Catch


Dans cet exemple, un calcul cre une exception de division par zro, qui est ensuite intercepte. Sans les blocs try et catch, ce programme chouerait.

class ProgramTryCatch { static void Main() { int x=0, y=0; try { /* bloc qui genere lexception */ x = 10 / y; } /*bloc qui gere l exception */ catch (System.DivideByZeroException) { System.Console.WriteLine( impossible de diviser par 0"); } } /* le bloc finally est facultatif */ }
110 A.ELmagri 21/03/2013

Leve dune exception


Alors comment cela fonctionne-t-il ? Comment le runtime sait-il qu'il doit aller dans un bloc catch (ou pas) en cas d'erreur ? Lorsqu'une erreur est dtecte, le code lve une exception : avec throw new Exception(), Et c'est ce moment l que l'excution normale du bloc try s'arrte pour passer dans le bloc catch appropri : catch (Exception e) { }

111

A.ELmagri

21/03/2013

Exemple : de mot cl throw


class ProgramThrow { /* methode faire */ static void Faire(int x) { if (x > 5) { throw new ArgumentOutOfRangeException("X is too large"); }} /* methode main*/ static void Main() { try { Faire(10); } catch (ArgumentOutOfRangeException ex) { System.Console.WriteLine(ex.Message); } } } le bloc finally a t ommis : celui est en effet facultatif.

112

A.ELmagri

21/03/2013

Quelques classes d'exceptions


Le Framework .Net offre beaucoup de classes grant les exceptions dont :
System.Exception
System.SystemException System.ArgumentException System.ArgumentNullException System.OutOfRangeException System.IO.FileNotFoundException System.ApplicationException

Les relations dhritage entres les diffrentes Classes exceptions


113 A.ELmagri 21/03/2013

Exemple:
using System; public class Program { public static void Main() { int nombre = 0; bool quit = false; while (!quit) { Console.Write("Entrez un nombre : "); string chaine = Console.ReadLine(); try { /* Code risque : il se peut que l'utilisateur n'entre pas un nombre , que ce nombre ne soit pas un entier compris entre - 2 147 438 648 et + 2 147 438 647 */

nombre = Int32.Parse(chaine); quit = true; } /* ici pour chaque type d exception on a fait un catch*/ catch (ArgumentExceptio argEx) { Console.WriteLine(argEx.Message ); } catch (FormatException formEx) { Console.WriteLine(formEx.Messa ge); } catch (OverflowException overEx) { Console.WriteLine(overEx.Messag e); } } } }

114

A.ELmagri

21/03/2013

Crer sa propre exception


Et bien oui, cest possible!! Prenons la classe Personne dj cr. Imposons la condition: Si lutilisateur saisit une valeur dge <= 18 ou >= 60 , le systme doit lev une exception La solution consiste crer une classe AgeException.
public class AgeException : Exception { public AgeException(string msg): base(msg) { } }

1 1

A.ELmagri

21/03/2013

Utiliser lexception cre


//Dans le constructeur de la classe Personne public Personne (String nom, int age) { //lever une exception si lage n est pas valide if (age < 18 || age > 60) throw new AgeException("l'age doit etre entre 18 et 60"); else { this.nom = nom; this.age = age; } }

1 1

A.ELmagri

21/03/2013

Utiliser lexception cre


// Dans le setter public int SetAge(int value) { //lever l exception si lage n est pa valide if (value < 18 || value > 60) throw new AgeException("l'age doit etre entre 18 et 60"); else { age = value; } } }

1 1

A.ELmagri

21/03/2013

La Srialisation dobjet

118

A.ELmagri

21/03/2013

La srialisation dobjet
La srialisation (en anglais serialization) est un procd qui

consiste sauver l'tat d'un objet sur le disque ou le rseau plutt que de le garder en mmoire. On peut dire que l'objet est "aplatit" pour pouvoir le convertir en un flux de donnes, que l'on peut transmettre un autre objet via la dsrialisation La srialisation et la dsrialisation se fait via des fichiers (binaire, XML,).

1 1

A.ELmagri

21/03/2013

Srialiser un objet (XML)


On cre la classe personne , pour pouvoir stocker lobjet dans un fichier il faut que celui-ci soi srializable. using System.IO; using System.Xml.Serialization; namespace test { public string Prenom [Serializable] { public class personne get { return prenom; } { set { prenom = value; } public personne() { } } string nom; string telephone; public string Nom public string Telephone { { get { return nom; } get { return telephone; } set { nom = value; } set { telephone = value; } } } string prenom;
1 2 A.ELmagri 21/03/2013

Srialiser un objet
// list des personne public static List<personne> carnet = new List<personne>(); // serialiser l'objet carnet : public static void SauvegarderXML(string nomfichier) { FileStream f = File.Open(nomfichier, FileMode.OpenOrCreate); XmlSerializer s = new XmlSerializer(typeof(List<personne>)); s.Serialize(f, carnet); f.Close(); }
1 2 A.ELmagri 21/03/2013

Srialiser un objet

// dserialiser l'objet carnet : public static List<personne> ChargerXML(string nomfichier) { FileStream f = File.Open(nomfichier, FileMode.Open); XmlSerializer s = new XmlSerializer(typeof(List<personne>)); List<personne> lis = (List<personne>)s.Deserialize(f); f.Close(); return lis; }
1 2 A.ELmagri 21/03/2013

Srialiser un objet

public static void Main(string[] args) { personne p = new personne(); p.Nom = "aa"; p.Prenom = "fff"; p.Telephone = "12356"; // ajouter la personne la liste personne.carnet.Add(p); // sauvgarder dans le fichier nomm test personne.SauvegarderXML("test"); }
1 2 A.ELmagri 21/03/2013

Srialiser un objet
Rsultat

1 2

A.ELmagri

21/03/2013

Dsrialiser un objet

public static void Main(string[] args) { // creer une liste et la remplir partir du fichier List<personne> k = personne.ChargerXML("test"); // parcourir la liste foreach (personne s in k) { System.Console.WriteLine(s.Nom + " " + s.Prenom + " " + s.Telephone); }
1 2 A.ELmagri 21/03/2013

DSrialiser un objet
Rsultat

1 2

A.ELmagri

21/03/2013

Srialiser un objet (BIN)


On travaille avec la mme classe Personne dj cr:
Using System.IO; Using System.Xml.Serialization; using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters.Binary; namespace test public string Prenom { { [Serializable] get { return prenom; } public class personne set { prenom = value; } { } public personne() { } string telephone; string nom; public string Telephone public string Nom { { get { return telephone; } get { return nom; } set { telephone = value; } set { nom = value; } } } string prenom;
1 2 A.ELmagri 21/03/2013

Srialiser et dserialiser un objet (BIN)

// serialiser l'objet carnet en binaire : public static void SauvegarderBin(string nomfichier) { FileStream f = File.Open(nomfichier, FileMode.OpenOrCreate); IFormatter s = new BinaryFormatter(); s.Serialize(f, carnet); f.Close(); } // dserialiser l'objet carnet en binaire : public static List<personne> chargerBin(string nomfichier) { FileStream f = File.Open(nomfichier, FileMode.Open); IFormatter s = new BinaryFormatter(); List<personne> lo = (List<personne>)s.Deserialize(f); f.Close(); return lo; }
1 2 A.ELmagri 21/03/2013

Srialiser et dserialiser un objet (BIN)


public static void Main(string[] args) { personne p = new personne(); p.Nom = "aa"; p.Prenom = "fff"; // Ajouter la personne la liste personne.carnet.Add(p); // Sauvgarder dans le fichier nomm test personne.SauvegarderBin("test"); // Creer une liste et la remplir partir du fichier List<personne> k = personne.chargerBin("test"); // Parcourir la liste foreach (personne s in k) { System.Console.WriteLine(s.Nom + " " + s.Prenom + " " + s.Telephone); }
1 2 A.ELmagri

p.Telephone = "12356";

21/03/2013

FI N

130

A.ELmagri

21/03/2013