Vous êtes sur la page 1sur 102

ROYAUME DU MAROC

Office de la Formation Professionnelle et de la Promotion du Travail

La programmation oriente objet


(POO)
Propos par : Mohammed CHAKOUJ

OFPPT ISGI LAAYOUNE


2014/2015

Programmation oriente objet

M.CHAKOUJ

TABLE DES MATIERES :


Table des matires :2
Chapitre 1 : Introduction la POO....................................................................................................................................... 6
Objectif du module :......................................................................................................................................................... 6
I.

Programmation oriente objet VS programmation structure : ............................................................................. 6

II.

Concepts de base de la Programmation Oriente Objet(POO) :............................................................................. 6

1-Dfinitions : ................................................................................................................................................................... 6
2-Les avantages de la POO : ......................................................................................................................................... 6
3-La notion dobjet : ..................................................................................................................................................... 7
4-La notion de classe : .................................................................................................................................................. 7
5-La notion dencapsulation : ....................................................................................................................................... 8
6-Communication entre objets : .................................................................................................................................. 8
7-La notion dabstraction : ........................................................................................................................................... 9
III.

Le Langage C# : ..................................................................................................................................................... 9

TEST chapitre 1 : ............................................................................................................................................................... 10


Chapitre 2 : LIDE Visual Studio 2010 et larchitecture du dotNet .................................................................................... 11
I.

LIDE Visual Studio de Microsoft : .......................................................................................................................... 11

II.

Cration du premier projet : .................................................................................................................................. 11

III.

Larchitecture de .NET Framework..................................................................................................................... 14

TEST chapitre 2 : .............................................................................................................................................................. 16


Chapitre 3 C# : Notions de base ......................................................................................................................................... 17
I.

Commentaires en C# : ............................................................................................................................................ 17

II.

Les types de base : ................................................................................................................................................. 17

III.

Identificateurs en C# .......................................................................................................................................... 19

IV.

Oprations dentre/sortie ................................................................................................................................ 19

1.

Affichages ........................................................................................................................................................... 19

2.

Lecture de donnes saisies au clavier ................................................................................................................ 20

V.

Linstruction if :....................................................................................................................................................... 20

VI.

Linstruction Switch : ......................................................................................................................................... 21

VII.

Les boucles : ....................................................................................................................................................... 21

TP1 ..................................................................................................................................................................................... 23
Chapitre 4 : Notre premire classe en C# .......................................................................................................................... 24
I.

Lajout dune nouvelle classe un projet: ............................................................................................................ 24

II.

La porte des attributs et mthodes :.................................................................................................................... 25

III.

Le mot cl this : .................................................................................................................................................. 26

IV.

Le test de la classe personne :............................................................................................................................ 26


2

Programmation oriente objet

M.CHAKOUJ

V.

L'oprateur new : ................................................................................................................................................... 27

VI.

Constructeurs de classe...................................................................................................................................... 27

VII.

La surcharge dune mthode : ........................................................................................................................... 28

VIII.

Le type objet est un type rfrence : ................................................................................................................. 29

IX.

Passage de paramtres: ..................................................................................................................................... 30

1.

Passage de paramtres par rfrence .................................................................................................................. 30

2.

Passage de paramtres en sortie : le mot cl out .................................................................................................. 31

X.

Tableaux statiques ................................................................................................................................................. 31


1.

La classe Array : .................................................................................................................................................. 31

2.

Syntaxe de dclaration et cration dun tableau: ............................................................................................. 33

a.

Tableaux une dimension ................................................................................................................................. 33

b.

Tableau deux dimensions : .............................................................................................................................. 33

3.

Le parcours dun tableau en lecture avec la boucle foreach : .......................................................................... 34

XI.

Les chaines de caractres : la classe System.String........................................................................................... 36

XII.

Les structures : ................................................................................................................................................... 38

XIII.

Les numrations................................................................................................................................................ 39

XIV.

Les fichiers texte en C# :..................................................................................................................................... 40

TP2 ..................................................................................................................................................................................... 43
Chapitre 5 : Accesseurs , Proprits ,et membres static .................................................................................................. 46
I.

Mthodes de lecture et d'criture des attributs privs : ....................................................................................... 46

II.

Les proprits ......................................................................................................................................................... 47

III.

Les mthodes et attributs de classe : le mot cl static ...................................................................................... 48

TP3 ..................................................................................................................................................................................... 52
Chapitre 6 : Lhritage et le polymorphisme..................................................................................................................... 55
I.

Lhritage................................................................................................................................................................ 55
1.

Dfinition : .......................................................................................................................................................... 55

2.

Syntaxe : ............................................................................................................................................................. 55

3.

Constructeurs et chanage ................................................................................................................................. 57

4.

Rfrence d'instance .......................................................................................................................................... 58

II.

polymorphisme ...................................................................................................................................................... 58
1.

Principe............................................................................................................................................................... 59

2.

Mise en place ..................................................................................................................................................... 59

3.

Chainage des redfinitions ................................................................................................................................. 59

TP4 ..................................................................................................................................................................................... 61
Chapitre 7 : Classe abstraite et Interface .......................................................................................................................... 63
I.

Classe abstraite : .................................................................................................................................................... 63


3

Programmation oriente objet

M.CHAKOUJ

1.

Le mot cl abstract et mthode abstraite : ........................................................................................................ 63

2.

Classe abstraite : ................................................................................................................................................ 63

II.

Interfaces :.............................................................................................................................................................. 64

TP5 ..................................................................................................................................................................................... 66
Chapitre 8 : Les collections ................................................................................................................................................ 69
I.

La classe ArrayList : ............................................................................................................................................ 69

1.

Dfinition : ......................................................................................................................................................... 69

2.

Mthodes : ......................................................................................................................................................... 69

II.

La classe gnrique List<T> .................................................................................................................................... 71


3.

Traiter des objets (le tri) : ................................................................................................................................... 74

a.

En implmentant linterface IComparable ......................................................................................................... 74

b.

En dfinissant une classe de comparaison implmentant linterface IComparer : ........................................... 75

III.

Autres classes de collections : ............................................................................................................................ 76

TP 6 .................................................................................................................................................................................... 79
Chapitre 9: Gestion des exceptions................................................................................................................................... 83
I.

Exceptions : ............................................................................................................................................................ 83

II.

Grer une exception ? ............................................................................................................................................ 83


1.

Programme sans gestion de l'exception ............................................................................................................ 83

2.

Attraper une exception ...................................................................................................................................... 84

3.

Programme avec gestion de l'exception : .......................................................................................................... 85

4.

Libration des ressources avec finally : .............................................................................................................. 87

III.

Lancer une exception ......................................................................................................................................... 87

1.

Lancer une exception prdfinies de C#. ........................................................................................................... 87

2.

Dclenchement manuel d'une exception personnalise : ................................................................................. 88

TP7 ..................................................................................................................................................................................... 90
Chapitre 10 : La Srialisation binaire ................................................................................................................................. 92
I.

Dfinitions : ............................................................................................................................................................ 92

II.

Srialisation et dsrialisation : ............................................................................................................................. 92

Chapitre 11 : Type nullable,type var,type dynamic,Regex,using ....................................................................................... 94


I.

Les types nullable : ................................................................................................................................................. 94

1-Intorduction : .............................................................................................................................................................. 94
2.Syntaxe : ...................................................................................................................................................................... 94
II.

Le type var : ............................................................................................................................................................ 95

III.

Le type dynamic : ............................................................................................................................................... 96

XV.

Les expressions rgulires : System.Text.RegularExpressions ......................................................................... 96

2.

Syntaxe ................................................................................................................................................................... 96
4

Programmation oriente objet

M.CHAKOUJ

3.

Exemples ................................................................................................................................................................ 97

4.

Utilisation en .Net .................................................................................................................................................. 97

a.

Validation d'une chane.......................................................................................................................................... 97

b.

Remplacement dans une chane ............................................................................................................................ 98


c.

Dcoupage dune chaine par sparateur ........................................................................................................... 98

Ressources bibliographiques : .......................................................................................................................................... 100


Annexe :Liste mots cls en C# ...................................................................................................................................... 101

Programmation oriente objet

M.CHAKOUJ

Chapitre 1 : Introduction la POO


Objectif du module :
Lobjectif de ce module vise ce que le stagiaire utilise les concepts de la programmation oriente
objet en dveloppant des applications en mode console avec le langage de programmation C# (prononc
Csharp). Le dveloppement des interfaces graphiques et laccs aux bases de donnes sont traits dans les
modules "Programmation Evnementielle et Programmation Client/Serveur".
I.

Programmation oriente objet VS programmation structure :


Dans la programmation il faut faire la distinction entre :
Les langages procduraux, disposant de la notion de fonction, outil qui permet de structurer un programme
en le dcomposant en des parties relativement indpendantes.( langage C,pascal)
Les langages objet, disposant en plus des notions de classe et dobjet ; comme nous le verrons, les classes
permettent galement de structurer un programme en le dcomposant en des parties autonomes.
II.

Concepts de base de la Programmation Oriente Objet(POO) :

1-Dfinitions :
La programmation oriente objet est une programmation qui sinspirer du monde rel et se base sur le
principe dinteraction entre des objets (briques logiciels).

Aujourdhui lapproche objet occupe une place prpondrante dans le gnie logiciel. En effet, ces dernires
annes nous avons assist tout dabord une utilisation plus large des langages de programmation objet de
rfrence comme C++, C# et Java et ensuite lintroduction des concepts objet dans dautres langages comme
par exemple VB.NET, Perl et mme Cobol.
2-Les avantages de la POO :
Par rapport une approche fonctionnelle associe un dveloppement classique men laide des
langages procduraux, on est en droit de sinterroger sur les avantages quapporte rellement le
dveloppement laide dun langage objet comme par exemple C++, C# ou Java.
En fait, deux avantages prpondrants sont mis en gnral en avant lorsque lon choisit une approche objet :
La modularit Par construction, tant donn que lon conoit des classes reprsentant une entit de taille
limite en donnes et en oprations, il est plus ais de construire des systmes modulables.
6

Programmation oriente objet

M.CHAKOUJ

La rutilisabilit : La dfinition dun systme laide de classe ayant chacune la responsabilit dun sousensemble de donnes et des oprations associes favorise fortement la potentialit de trouver des classes
rutilisables. La rutilisation de classe se ralise soit sur le plan mtier lintrieur dune mme entreprise
dans des applications diffrentes, soit sur le plan technique lchelle de tous les dveloppements raliss
laide dun mme langage. Sur ce dernier aspect, cest toute lapproche du dveloppement par composant qui
est en jeu.
Au-del de ces deux avantages majeurs et compte tenu de la plus grande modularit dans la construction dune
application laide dobjets, la maintenance lmentaire de chaque classe est en soi plus simple raliser que
celle dun logiciel unique traitant toutes les donnes dun systme. Il importe bien entendu dans lapproche
objet de construire son systme en veillant minimiser le nombre de relations entre classes.
3-La notion dobjet :
Le concept dobjet consiste regrouper dans une mme entit des donnes quon nomme des attributs (ou
encore des champs) , ces donnes peuvent tre manipuler laide des fonctions quon nomme mthodes (ou,
parfois, fonctions membres). Un objet possde donc :
Les attributs: Les attributs sont les lments d'un objet qui reprsentent les champs (variables) ce sont eux
qui stockent les donnes grer. Tout comme n'importe quelle autre variable, un champ peut possder un type
quelconque dfini au pralable : nombre, caractre, ..., ou mme un type objet. Autrement dit les attributs se
sont des donnes qui reprsentent ltat dun objet
Les mthodes: Les mthodes sont les traitements dfinies dans la classe de lobjet. Is servent d'interface entre
les donnes et le programme utilisant lobjet. Sous ce nom obscur se cachent simplement des procdures ou
fonctions destines traiter les donnes. Les champs et les mthodes d'un objet sont ses membres.
4-La notion de classe :
Une classe est une description abstraite dun objet (dclaration dun type), pouvant donner naissance
diffrents objets disposant de la mme structure de donnes (mmes attributs) et des mmes mthodes.
Diffrents objets dune mme classe se distinguent par les valeurs de leurs attributs ; en revanche, ils partagent
les mmes mthodes. Elle peut tre considre en quelque sorte comme un moule.
Un objet est donc issus dune classe cest le produit qui sort dun moule. On dit quun objet est une
instanciation dune classe, donc un objet peut tre appel une instance.
Exemple : La figure suivante modlise une classe Robot :

Programmation oriente objet

M.CHAKOUJ

Un objet robot est caractris par les attributs : VitG,VitD, sensG, sensD.Pour pouvoir manipuler ces
attributs nous devons forcment utiliser les mthodes :reculer(),avancer(),Tourner(), et freiner().
5-La notion dencapsulation :
Par rapport lapproche classique, lapproche objet se caractrise par le regroupement dans une mme classe
de la description de la structure des attributs et de la description des oprations. Ce regroupement des deux
descriptions porte le nom dencapsulation donnes-traitements.
Plus prcisment, les donnes ne sont accessibles qu partir doprations dfinies dans la classe comme
lindique la figure ci-dessous :

6-Communication entre objets :


Les objets vont tre capables dinteragir et de communiquer entre eux par lintermdiaire des mthodes
publiques en changeant des messages :
Pour envoyer un message au robot :
-On appelle la mthode (exemple : tourner() )
-En spcifiant lobjet cible ( exemple : monRobot)
- En prcisant dventuels paramtres
Lappel de mthode est effectu par un autre objet (exemple un objet de la classe Pilote :

Programmation oriente objet

M.CHAKOUJ

Note :
Dans la POO, les classes sont des abstractions des entit du champ de ltude de lapplication.
7-La notion dabstraction :
Il est important de comprendre que la programmation nest pas un processus de reproduction informatique de
toutes les dtails dun concept du monde rel .Lorsque nous allons programmer une classe personne, nous
nallons pas essayer de modliser tous ce qui concerne une personne, mais seulement les informations
spcifiques lapplication dvelopper.
Ce concept est appel abstraction et il est important pour surmonter la complexit du monde rel, donc il faut
rester toujours dans le contexte de lapplication lors de la conception des classes.
Remarque :
Pour reprsenter une classe, on utilise le diagramme de classe du langage de modlisation UML (Unified
Modeling Language) :

III.
Le Langage C# :
Le C# est un langage de programmation oriente objet .Apparu en 2001, il est principalement inspir par le
Java (1995) mais aussi par le C++. Ce langage dont le nom se prononce C-Sharp t cr par Microsoft
t normalis par lECMA lanne de sa sortie (puis par lISO deux ans plus tard). Il y a eu quatre versions du
C# implmentant toujours quelques fonctionnalits supplmentaires. Le C# tant un produit du framework
.NET leurs volutions sont trs lies. Le C# 2.0 est sorti avec le framework 2.0 (VS 2005), le C# version 3
(introduit avec Visual Studio 2008 en novembre 2007) a apport : les proprits automatiques ,les initialisations de collections ,les variables dclares avec var les types anonymes ,les expressions lambda,Linq .
9

Programmation oriente objet

M.CHAKOUJ

Pour utiliser la syntaxe du C#3.0 il faut utiliser le compilateur adapt dans un environnement cible 2.0 ou
suprieur. Ce compilateur est notamment disponible et implment avec lIDE VisualStudio 2008.
C# version 4, introduit avec Visual Studio 2010, et apporte plusieurs nouveauts (le type dynamic, arguments
nomms et par dfaut,)
TEST chapitre 1 :
Cochez les bonnes rponses :
Q1) Une classe est :

o un ensemble dobjets possdant le mme nom.


o Un ensemble dinstructions
o une dclaration dun type, possdant des donnes propres et des traitements.
Q2) Dans un objet on trouve une partie comportementale statique et une partie comportementale dynamique.
Donnez la signification de chacune de ces parties.

o Partie statique : reprsente l'tat de l'objet grce des mthodes


Partie dynamique reprsente le comportement opratoire de l'objet

o Partie statique : reprsente l'tat de l'objet grce des attributs


Partie dynamique reprsente le comportement opratoire de l'objet

o Partie statique : reprsente le comportement opratoire de l'objet


Partie dynamique : reprsente l'tat de l'objet grce des mthodes

Partie statique : reprsente le comportement opratoire de l'objet grce des mthodes


Partie dynamique : reprsente l'tat de l'objet grce des attributs
10) Comment agit-on sur un objet ?

o On agit sur un objet travers la modification de ses attributs.


o On agit sur un objet en passant ses attributs en paramtre.
o On agit sur un objet en utilisant un systme de messagerie e-mail.
o On agit sur un objet travers l'envoi de messages grces aux mthodes.
Q3) Expliquer le mcanisme de communication entre objets par un exemple
Q4) Citez les avantage de la POO par rapport la programmation structure.
Q5) Lencapsulation est le faite de :

o qualifier les attributs private et les mthodes public ;


o attribuer des qualificateurs de visibilits aux membres ;
o regrouper les attributs (donnes)et les mthodes(traitements) dans la classe.
o restreindre laccs aux attributs certaines oprations dfinies dans la classe.
Q6) C# est un langage de programmation :

o orient objet dvelopp par Sun ;


o procdural dvelopp par MicrosofT
o orient objet dvelopp par Microsoft
Q7) la dernire version de C# est C# 4 ?

o Vrai
o Faux
10

Programmation oriente objet

M.CHAKOUJ

Chapitre 2 : LIDE Visual Studio 2010 et larchitecture du dotNet


I.
LIDE Visual Studio de Microsoft :
Visual Studio est linterface de dveloppement de Microsoft. Elle est compose dun ensemble doutils
permettant aux dveloppeurs de crer des applications pour les plateformes .NET. Visual Studio 2010 est
distribu en plusieurs ditions :
Express : Microsoft fournit gratuitement cette dition limite de Visual Studio 2010 dans un but de
formation pour les dveloppeurs. Elle runit toutes les fonctionnalits de base pour la cration de
projets.
Professional : dition destination des dveloppeurs professionnels seuls ou au sein de petites
quipes. Les outils de dbogage et de tests unitaires font partie des fonctionnalits notables de cette
dition.
Premium : pour les quipes professionnelles travaillant sur des projets ncessitant plus dinteractions
entre leurs membres. En plus des fonctionnalits de ldition Professional, cette dition offre les
fonctionnalits de test de lUI (Interface utilisateur), de dveloppement de base de donnes et de la
gnration au dploiement en passant par les tests.
Ultimate : en plus des fonctionnalits de ldition Premium, cette dition contient lIntelliTrace, outil
supplmentaire pour le dbogage dapplications, le gestionnaire de tests, et des outils de design darchitecture
dapplications.
Dans ce polycopie, ldition Ultimate sera utilise pour la prsentation des exemples bien que la totalit soit
valable avec ldition Express.

II.
Cration du premier projet :
Comme indiqu dans le guide pdagogique nous allons dvelopper tout au long de ce module que des
applications console.
Pour crer un projet Application console avec Microsoft VS 2010, allez au menu dmarrer, tous les
programmes, cherchez le logiciel Microsoft VS 2010, lancez le !
Slectionnez Nouveau Projet dans langlet Fichier !

11

Programmation oriente objet

M.CHAKOUJ

Puis slectionnez Visual C# Windows pour le type de projet , et Application console pour le modle :

Nommez le projet tp , et slectionnez un dossier de votre choix laide du bouton Parcourir . Enfin cliquez
sur OK.
Le projet se prsente sous la forme dune arborescence :

12

Programmation oriente objet

M.CHAKOUJ

Si lexplorateur de solution ne saffiche pas,


pas vous
pouvez lafficher partir de longlet Affichage
(raccourci clavier :clts+w,s)

Par dfaut le projet tp contient le fichier source Program.cs (lextension cs signifier Csharp).
Dans ce fichier vous aller trouver le squelette de la classe programme :

Testons maintenant ce projet. Tout dabord ajoutons des instructions dans le corps de la mthode
m
Main de la
classe Program. :

13

Programmation oriente objet

M.CHAKOUJ

Pour lancer lexcution, il y a plusieurs mthodes pour ce faire : Soit le lancer partir de lapplication :
Soit directement avec la touche F5 Soit avec la commande ctr+F5 qui demande lutilisateur de taper une
touche la fin de lexcution de toute instruction.
instructio
Remarques :
La diffrence entre projets et solutions
Un projet est un ensemble de fichiers qui seront compils en un seul assemblage (.exe ou .dll).
Une solution est un ensemble dun ou plusieurs projets. De la mme manire quun projet un point
dentre, une solution a un projet de dmarrage. Ce projet est identifiable dans lexplorateur de
solutions car son nom est en gras.
Une application C# doit contenir obligatoirement une mthode
mthode Main().Cette mthode doit tre publique et
statique via les mots cls public et static, qui spcifient respectivement au compilateur que la mthode est
accessible depuis lapplication et en dehors, que la mthode est globale et que la classe na pas besoin
bes
dtre
instancie pour pouvoir lappeler.
III.
Larchitecture de .NET Framework
Vous allez, sans doute, remarquer que tout fichier dune classe en C#, contient en entte un ensemble de
lignes qui commencent par le mot cl using qui fait rfrence des bibliothques
iothques de classes.
Le schma suivant montre larchitecture en couches de .NET Framework et lemplacement de cette librairie
de classes :

Le CLR est lenvironnement dexcution des applications. Il est multi-langage grce au CLS (Common
Language Specification) qui est un ensemble de rgles respecter par un langage pour pouvoir le compiler et
excuter avec le CLR. La grande force du CLR est de pouvoir combiner plusieurs assemblages quel que soit
le langage dans lequel ils ont t crits. Une application crite en C# pourra ainsi faire rfrence et utiliser une
14

Programmation oriente objet

M.CHAKOUJ

librairie crite en VB. Pour en arriver ce niveau de compatibilit, le compilateur convertit le code en langage
intermdiaire (IL) permettant dtre interprt de la mme manire quel que soit le langage dans lequel le code
a t crit. La compatibilit des types entre les diffrents langages est assure par le CTS (Common Types
System). Chaque type de base dun langage possde un quivalent dans le Framework .NET et donc en
langage intermdiaire. Ainsi, un integer en VB et un int en C# seront du mme type System.Int32.
Une fois compile, une application se rsume au moins un fichier excutable. Celui-ci est en langage
intermdiaire.
Lorsque lexcution est lance, le CLR examine le manifeste pour dterminer si les conditions de scurit sont
respectes. Si tel est le cas, le CLR cre un processus pour hberger lapplication et le code est compil du
langage intermdiaire en code binaire par le compilateur JIT (Just In Time). Ce code gnr est ensuite stock
en mmoire de manire ne pas tre recompil en cours dexcution et optimiser les performances.
La troisime couche : librairie de classes fondamentales Le Framework .NET est compos de plusieurs
bibliothques de classes, classes en espaces de noms, organiss de manire hirarchique partir de lespace
de noms racine System. Les fonctionnalits (classes) en relation sont donc classes au sein dun mme espace
de noms. System.IO, par exemple, regroupe les types ayant pour but dinteragir avec le systme de fichiers.
Remarques :
-Ces bibliothques de classes sont consultables via lexplorateur dobjets

La classe Console qui se trouve dans lespace de noms


System se dclare comme :System.Console.
Les NameSpaces servent ranger les classes un peu
comme dans des dossiers. Ces imports despaces de
nom permettent daccder directement tous les
lments contenus (appart les NameSpaces quil
contient) sans avoir mentionn o il est rang. Plus
vous ferrez de using plus vous aurez de propositions
lauto compltion dans VS 2008, do lintrt de
limiter lusage des using car cela permet une auto
compltion plus rapide et plus pertinente

15

Programmation oriente objet

M.CHAKOUJ

TEST chapitre 2 :
Q1-Cest quoi Visaul Studio ?
Q2-VS 2010 est un IDE open source :

o Vrai
o Faux
Q3-Avec VS2010 on peut dvelopper que des applications consoles :

o Vrai
o Faux
Q4-Un projet C# peut avoir plusieurs objets de dmarrage :

o Vrai
o Faux
Q5-La fonction static void Main() est le point dentre o commence lexcution dun programme C# :

o Vrai
o Faux
Q6-Cest quoi le dotNet framework ?
Q7-Un espace de nom est :
a)la dfinition dune classe
b)conteneur du code dun ensemble de classe.
c) un rpertoire logique contenant des classes. Comme pour les fichiers, les classes doivent avoir un nom
unique dans un espace de noms donn.

16

Programmation oriente objet

M.CHAKOUJ

Chapitre 3 C# : Notions de base


I.

Commentaires en C# :

Les commentaires peuvent galement servir pour fournir une documentation au format XML. Cette
documentation XML pourra tre interprte par lIntelliSense pour fournir la description des membres, des
paramtres ou encore des exceptions.
II.
Les types de base :
C# vous donne la possibilit de travailler avec deux types de donnes (objets), le type valeur et le type
rfrence.
Les types valeur contiennent les donnes tandis que celles de rfrence contiennent une rfrence vers la
donne stocke quelque part dans la mmoire. Les types primitives telles que int,char float,structures,, sont
des type valeur. Les types object,string,les tableaux sont des types rfrence. Le tableau ci-dessous liste les
type de base en C# :

Remarques:
-Si vous voulez trouver facilement la valeur maximale et la valeur minimale dun type numrique, faites
System.Int32.MaxValue pour retourner le plus grand des int ou MinValue pour trouver le plus petit.
-C# respecte la casse :nbr et Nbr sont deux identificateurs diffrents.
-Noter quen C# tout est objet, mme les types sont des classes. Pour dcouvrir les diffrents membres dune
classe (par exmeple la classe char) utiliser lexplorateur dobjet du VS :

17

Programmation oriente objet

M.CHAKOUJ

Linstruction suivante dclare une variable de type entier (int) et lui affecte une valeur. Le compilateur lve
une exception si un type valeur est utilis sans avoir t affect :
int i = 1;
18

Programmation oriente objet

M.CHAKOUJ

-Loprateur is permet de dterminer le type dun objet :


-Les constantes :

III.
Identificateurs en C#
Un identificateur est le nom de variable mais aussi de fonction, de classe, etc.
Diffrence par rapport au C: C# accepte les lettres accentues.
IV.

Oprations dentre/sortie
1. Affichages

19

Programmation oriente objet

M.CHAKOUJ

Remarques :
-Pour forcer un fond bleu, on crit :
Console.BackgroundColor = ConsoleColor.Blue;
Console.ForegroundColor = ConsoleColor.Red;
Console.Clear();//effacer le contenu de lcran
-Pour changer le titre de la fentre :
Console.Title = "Mon application";
- Pour changer la taille de la fentre (et la faire passer 38 lignes de 64 caractres) :
Console.SetWindowSize(64, 30);
-Pour positionner le curseur au point (10, 20) et afficher du texte en rouge sur fond noir :
Console.SetCursorPosition(10, 20);
-Du sons :

2. Lecture de donnes saisies au clavier

V.
Linstruction if :
Analysons quelques instructions qui sont valide en langage C (qui considre un int non nul comme une valeur
boolenne true ) mais qui ne le sont pas en C# (on suppose que i est de tout type diffrent de bool) :

20

Programmation oriente objet

M.CHAKOUJ

VI.
Linstruction Switch :
En C# Switch accepte les chanes de caractres (objets string) dans le slecteur.
Comme en C, linstruction switch effectue un aiguillage vers une ou plusieurs instructions en fonction du
contenu dune variable de contrle :
switch (val)
{
case valeur : une ou plusieurs instructions;
break;
case valeur : une ou plusieurs instructions;
break;
default : une ou plusieurs instructions;
break ;
}
VII.
Les boucles :
Les instructions for, while et do while sont semblables. Comme en C, trois formes de boucle (while, do while
et for) sont possibles. Quelle que soit la forme de la boucle, les accolades peuvent tre omises si le corps de la
boucle se rsume une seule instruction. Un if, mme compliqu, ainsi quun do, un while, un for ou encore
un switch sont assimils une seule instruction.

21

Programmation oriente objet

M.CHAKOUJ

22

Programmation oriente objet

M.CHAKOUJ

TP1
Exercice 1 :
Ecrire un programme en C# qui permet de calculer la somme ,le produit de deux nombres saisis par
lutilisateur.
Exercice 2:
Ecrire un programme ralisant une calculette pour les opration + ,-,/,*.
Au dbut une menu doit tre afficher lutilisateur ,puis on lui demande de choisir lopration choisie, puis la
saisi des deux oprandes.
Exercice 3:
Ecrire un programme qui permet dafficher le maximum parmi 10 nombres saisi au clavier.
Exercice 4:
Ecrire un programme en C qui dtermine la nme valeur Un de la suite suivante :
U1 = 1
U2 = 1
Un = Un-1 + Un-2.
Exercice 5:
Ecrire un programme C# servant calculer la valeur absolue
d'un nombre rel x partir de la dfinition de la valeur absolue. La valeur
absolue du nombre rel x est le nombre rel |x| :
|x| = x , si x 0
|x| = -x si x < 0
Exercice 6:
On souhaite crire un programme C# de rsolution dans R de
l'quation du second degr : Ax2 + Bx +C = 0
Exercice 7:
Ecrire un programme qui permet de lire le nom,le prnom,la date de naissance dune personne (contrler la
validit des donnes).

23

Programmation oriente objet

M.CHAKOUJ

Chapitre 4 : Notre premire classe en C#


La classe est llment central de tout programme C# (et de manire gnrale de tout programme .NET).
Tout doit en effet tre regroup dans une classe. Tout programme excutable (exe) est constitu dune ou
plusieurs classes dont lune comprend la fonction
fonction statique Main, point dentre du programme (quil sagisse
dune application console ou Windows). Toute librairie (dll pour Dynamic Link Libraries) est galement
compose dune ou plusieurs classes.
I.

Lajout dune nouvelle classe un projet:

Comment ajouter une classe notre projet: Bouton droite sur le projet :

Nommer la classe Personne.


Saisis le code de cette classe :
class Personne
{
// attributs
private string prenom;
private string nom;
private int age;
// mthode initialise qui initialise les attributs par les valeurs de ses paramtres
public void Initialise(string n, string p, int age)
24

Programmation oriente objet

M.CHAKOUJ

{
nom = n;
prenom = p;
this.age = age;
}
/* une deuxime dfinition de la mthode initialise qui initialise les attributs par les valeurs de ceux de
lobjet personne pass en paramtre*/
public void Initialise(Personne p)
{
nom = p.nom;
prenom = p.prenom;
age = p.age;
}
// mthode identifie() qui affiche ltat dun objet
public void Identifie() {
Console.WriteLine("[{0}, {1}, {2}]", prenom, nom, age);
}
//mthode presentation() qui retourne une chaine contenant ltat dun objet
public string presentation() {
string str;
str = string.Format("nom:{0} prenom:{1} age:{2}", nom, prenom, age);
return str;
}
}
II.
La porte des attributs et mthodes :
Les niveaux daccs permettent de dfinir comment vont pouvoir seffectuer linstanciation des types et
lappel des mthodes. Le niveau daccs est dfini laide de mots cls prcdant la dclaration de la classe,
ou du membre. Le tableau suivant prsente les modificateurs daccs disponibles en C#:

Remarque :
1-Les attributs d'une classe sont dclares private alors que ses mthodes et proprits sont dclares public.
Cela signifie que l'utilisateur d'un objet (le programmeur) n'a pas accs directement aux donnes prives de
l'objet lextrieur de sa classe , mais peux faire appel aux mthodes publiques de l'objet ( notamment
celles qui donneront accs ses donnes prives).
2-Si aucun modificateur daccs nest prcis sur un membre, il est considr comme private.
3-Une classe ou une structure sans modificateur daccs sera considre comme internal.
25

Programmation oriente objet

M.CHAKOUJ

4-Les membres ne pourront jamais tendre leur niveau daccs au del de celui du type contenant.
III.
Le mot cl this :
this correspond linstance en cours de traitement. Regardons le code de la mthode Initialise :
public void Initialise(string n, string p, int age)
{
nom = n;
prenom = p;
this.age = age;
}
L'instruction : this.age=age signifie que l'attribut age de l'objet courant (this) reoit la valeur age de la
mthode Initialise . Le mot cl this dsigne l'objet courant : celui sur lequel sexcute la mthode Initialise.
age dsigne un attribut de l'objet courant ainsi que le paramtre age reu par la mthode. Il faut alors lever
l'ambigut en dsignant l'attribut age par this.age.
IV.
Le test de la classe personne :
Pour tester la classe Personne nous allons crer un objet p1 de type Personne partir de la mthode
Main() de la classe Program ,:

Voila le rsultat dexcution :

Regardons comment se fait l'initialisation de l'objet rfrenc par p1 dans le programme appelant :
p1.Initialise("Sadouk","Mohamed Amin",22); C'est la mthode Initialise() de l'objet p1 qui est appele. Donc
l'objet this dans la mthode Initialise(), rfrence ici l'objet p1.
Remarque :
Pour comprendre la notion des modificateurs daccs (visibilit des membres dune classe),
essayer dafficher directement le nom de la personne p1.Lorsque vous taper p1 suivi dun point , loutil
dauto-compltion vous donner les choix suivants :

26

Programmation oriente objet

M.CHAKOUJ

Vous remarquez que les attributs napparaissent pas, mais les mthodes oui, la raison cest que les attributs
sont dclars private .
Comment faire pour pouvoir accder aux attributs dun objet lextrieur de la classe ?
Cest le rle des Mthodes de lecture et d'criture des attributs privs.
V.
L'oprateur new :
Loperateur new permet de crer un objet .Pour crer un objet P1, il faut crire :
Personne p1=new Personne();
Ou bien
Personne p1 ;
p1=new Personne();
Cela a pour effet de crer un objet de type Personne non encore initialis : les attributs nom et prnom qui sont
des rfrences d'objets de type String auront la valeur null, et ge la valeur 0. Il y a donc une initialisation par
dfaut.
VI.
Constructeurs de classe
Un constructeur est une mthode qui porte le nom de la classe et qui est appele automatiquement lors de
la cration de l'objet. On s'en sert gnralement pour l'initialiser. C'est une mthode qui peut accepter des
arguments mais qui ne retourne aucun rsultat . Son prototype ou sa dfinition nest prcd d'aucun type (pas
mme void). Si une classe Y a un constructeur acceptant n arguments argi, la dclaration et l'initialisation d'un
objet de cette classe pourra se faire sous la forme :
NomDeLaClasse NomObjet=new NomConstructeur(Paramtres du constructeur) ;
Cd :
Y objet = new Y(arg1,arg2, ... argn);
Ou
Y objet;
Objet = new Y(arg1,arg2, ... argn);
Constructeur par dfaut :
Si le programmeur ne dfinit pas de constructeur dans sa classe, cest le constructeur par dfaut qui est appel
il est gnr automatiquement par le compilateur C# .

27

Programmation oriente objet

M.CHAKOUJ

VII.
La surcharge dune mthode :
Vous avez remarqu, sans doute, que nous avons donnes au constructeur plusieurs dfinitions, on dit quon a
surcharg la mthode constructeur (mais attention les signatures doivent tre diffrentes).
Pour pouvoir avoir le choix entre plusieurs possibilit darguments en entre il existe la surcharge
surch
des
mthodes. La surcharge dune mthode permet de changer la signature en gardant le mme nom. Une
surcharge permet de changer les paramtres et le type de retour.
Exemple : la classe DateTime contient 12 constructeurs

Testons maintenant ces constructeurs :

28

Programmation oriente objet

M.CHAKOUJ

VIII.

Le type objet est un type rfrence :

Y : est un objet de type


valeur(ex :type de
base,structures..)
X : est un objet de type
rfrence (ex :instance
dune classe X)

Lorsqu'on dclare la variable p1 par :


Personne p1=new Personne("Mohammed","Ali",33);
Pour rentrer un peu dans la technique, au moment de linstanciation dun objet, loprateur new cre lobjet et
le met une place disponible en mmoire. Cette adresse mmoire est conserve dans la variable p1(dans la
pile). On dit que p1 contient une rfrence vers lobjet.
p1 rfrence l'objet Personne("Mohammed","Ali",30); mais n'est pas l'objet lui-mme. En C, on dirait que
c'est un pointeur, c..d. l'adresse de l'objet cr.

29

Programmation oriente objet

M.CHAKOUJ

Si on crit ensuite : p1=null;

Ce n'est pas l'objet Personne("Mouhamed","Ali",30) qui est modifi, c'est la rfrence p1 qui change de
valeur. L'objet Personne("Mouhamed","Ali",30) sera "perdu" s'il n'est rfrenc par aucune autre variable,
cest le ramassage miettes (Garbage Collector )qui sen occupe de cette tche, il supprime tous les objets non
rfrencs.
Lorsqu'on crit : Personne p2=p1; on initialise le pointeur p2 : il "pointe" sur le mme objet (il dsigne le
mme objet) que le pointeur p1. Ainsi si on modifie l'objet "point" (ou rfrenc) par p1, on modifie aussi
celui rfrenc par p2.

Lorsqu'on crit : Personne p3=new Personne (p1); il y a cration d'un nouvel objet Personne. Ce nouvel objet
sera rfrenc par p3. Si on modifie l'objet "point" (ou rfrenc) par p1, on ne modifie en rien celui
rfrenc par p3.

IX.

Passage de paramtres:
1. Passage de paramtres par rfrence

Dans un passage par rfrence, le paramtre effectif et le paramtre formel sont une seule et mme entit. Si la
fonction modifie le paramtre formel, le paramtre effectif est lui aussi modifi. En C#, ils doivent tre tous
deux prcds du mot cl ref comme lindique lexemple ci-dessous.

Rsultat : ce code affiche 60.


30

Programmation oriente objet

M.CHAKOUJ

Remarque:
Lorsquun tableau est pass par valeur, cest la valeur de la rfrence qui est passe en argument.Comme cette
valeur indique o se trouvent les donnes du tableau, la fonction peut modifier ces donnes. Mais la fonction
est alors bien incapable de modifier la taille du tableau (ou de lannuler, en plaant la valeur null dans la
rfrence) car cela ncessite de recrer un tableau et donc de changer la rfrence.Pour pouvoir le faire il faut
passer la rfrence par rfrence (ref tableau).Cette constatation est vrai pour tous les type rfrences.
2. Passage de paramtres en sortie : le mot cl out
Le passage de paramtres en sortie permet de faire en sorte quune mthode force linitialisation dune
variable (jamais une valeur) passe en argument (toujours par rfrence) et que lappelant rcupre la valeur
initialise.

La mthode TryParse permet de tester la conversion dune chane. Elle renvoie vrai ou faux en fonction du
rsultat de la conversion et met jour lentier qui est pass en paramtre en utilisant le mot-cl out .
Si la conversion russit, alors lentier nombre est initialis avec la valeur de la conversion, calcule dans la
mthode TryParse(le chiffre1234).
Exercices dapplication :
1-Ecrire une mthode Permuter() qui permet de permuter le contenu de deux variable de type double passs en
paramtre.
2- Ecrire une mthode bool Division(doubl a,doubl b,out s) qui permet de calculer le quotient a/b et mit le
rsultat dans s.

X.

Tableaux statiques

1. La classe Array :
La classe Array sapplique aux tableaux, quel que soit le type des cellules. Des fonctions de cette classe
permettent notamment de trier des tableaux ou deffectuer des recherches dichotomiques dans un tableau tri.

31

Programmation oriente objet

M.CHAKOUJ

32

Programmation oriente objet

M.CHAKOUJ

2. Syntaxe de dclaration et cration dun tableau:


a. Tableaux une dimension
char [ ] TableCar ;//Dclaration de la rfrence
TableCar = new char[8]; //dfinition de la taille et allocation de la mmoire cration d'un
//nouvel objet tableau 8 cellules
Int [] ti = new int[]{100, 200, 300, 400};//avec initialisation
b. Tableau deux dimensions :
int[,] t = new int[2, 3];
Affectation des valeurs :
TableCar[0] = 'a';
TableCar[1] = '#';
...
TableCar[7] = '?';

33

Programmation oriente objet

M.CHAKOUJ

3. Le parcours dun tableau en lecture avec la boucle foreach :


Cest la boucle qui permet de faire le parcours dun tableau ou collection dobjets .
Syntaxe :
foreach(Type identificateurVariableDeParcours in nomTableau)
{
Instructions en lecture effectuer sur lobjet pointu
}
Remarque :
Attention, la boucle foreach est une boucle en lecture seule. Cela veut dire qu'il n'est pas possible de modifier
l'lment de l'itration en cours. Donc Si nous souhaitons utiliser une boucle pour changer la valeur de notre
liste ou de notre tableau, il faudra passer par une boucle for.
Exemple :
Pour afficher le tableau prcdent TableCar :
foreach ( char val in TableCar)
System.Console.WriteLine ( val );
Exemple : Tris et recherches dichotomiques
Pour illustrer les tris et recherches dichotomiques, nous allons crer un tableau dentiers, le trier
et effectuer une recherche dichotomique. On crit pour cela (n contiendra ici une valeur ngative puisque la
valeur 5 ne se trouve pas dans le tableau) :
int[] ti = {10, 1, 1000, 100};
Array.Sort(ti); // tri de ti
int n = Array.BinarySearch(ti, 5); // recherche de la valeur 5 dans ti
Exemple du code :
static void Main(string[] args)
{
//dclaration de deux vecteurs de types float
float [] t=new float[10];
float[] v = new float[20];
int n;
float vr;
//controle du nombre de cases remplir
do
{
Console.Write("donnez le nombre des lments: ");
int.TryParse(Console.ReadLine(), out n);
} while (n > 10);
//pour remplir tous les cases du tableau on mis t.length au lieu de n
for (int i = 0; i < n; i++)
{
Console.Write("donnez l'lment d'indice " + i+" ");
float.TryParse(Console.ReadLine(), out t[i]);
}
//trier le tableau t en ordre croissant
Array.Sort(t);
//affichage du tableau
Console.WriteLine("\n le tableau t Trier est ");
for (int i = 0; i < t.Length; i++)
34

Programmation oriente objet

M.CHAKOUJ

{
Console.Write(t[i] + " ");
}
Console.WriteLine("\nle max du tableau t est "+t.Max());
//copier les lments de t dans v
Array.Copy(t,v,t.Length);
Console.WriteLine("\n le tableau v est : ");
for (int i = 0; i < v.Length; i++)
{
Console.Write(v[i] + " ");
}
//inverser l'ordre des lments de t
Array.Reverse(t);
Console.WriteLine("\n le tableau t aprs inversement est ");
for (int i = 0; i < t.Length; i++)
{
Console.Write(t[i] + " ");
}
//recherche squencille
Console.WriteLine("\ndonnez lz valeur rechercher dans t");
float.TryParse(Console.ReadLine(), out vr);
Console.WriteLine("\nla valeur " + vr + " se trouve dans la case d'indice " + Array.IndexOf(t, vr));
//recherche dichotomique
Array.Sort(t);//le tableau doit etre trier pour pouvoir utiliser la recherche binaire
Console.WriteLine("\ndonnez lz valeur rechercher dans t");
float.TryParse(Console.ReadLine(), out vr);
Console.WriteLine("\nla valeur "+vr+" se trouve dans la case d'indice "+Array.BinarySearch(t,vr));

Exercice dapplication :
Ecrire le programme qui permet de saisir les noms de N stagiaires:
-Affiche lindice de la premire occurrence du nom Salmi ;
-Trier le tableau
Remarque :
Il est possible, avec les tableaux dobject, de crer des tableaux dont chaque cellule a un type particulier.
Object[] o = new object[4];
o[0] = "Chaine !";//une chaine
o[1] = 12;//un entier
o[2] = 12.456;//un double
o[3] = 'D';//un caractre
foreach (Object lment in o)
{
Console.WriteLine(lment);
}

Exercice :
Ecrire la boucle qui permet dincrmenter les entiers, et de concatner *-* avec les chaines contenues dans
le tableau prcdent ;

35

Programmation oriente objet

M.CHAKOUJ

XI.
Les chaines de caractres : la classe System.String
Les chanes de caractres sont reprsentes par des instances de la classe System.String du .NET Framework.
Les instances de cette classe sont immuables, cest--dire
que la cration dune nouvelle chane (suite une concatnation par exemple), ncessite la cration dune
nouvelle instance de la classe String.
La classe String contient en interne un tableau de char, cest--dire un tableau de caractres ; les caractres
dune chane sont donc indics en partant de 0.En C#, le mot-cl string est un raccourci pour la classe
System.String.
Longueur dune chaine :
string chane = Bonjour !;
int longueur = chane.Length; // Retourne 9
Accs en lecture un caractre : Loprateur [] permet dextraire un caractre de la chane mais nagit quen
lecture :
string s="Bonjour";
char c = s[0]; // Correct. c contient B
s[0] = X; // !!!! erreur de syntaxe !!!
Concatner deux chaines :
string s;
s = String.Concat(Bonjour, tout le);
s = s + monde !;
Console.WriteLine(s); // Affiche Bonjour tout le monde !
Extraire une sous chaine :
Lexemple suivant montre comment extraire le mot tout dans la chane de caractres Bonjour tout le
monde ! .
string s;
s = Bonjour tout le monde !;
s = s.Substring(8, 4); // La variable s contient tout
Comparaison de deux chaines :
Les oprateurs == et != (mais non <, <=, etc.) permettent de comparer deux chanes (== et != comparent les
contenus de chanes, ce qui nest pas vrai pour les tableaux et les objets o ce sont uniquement les rfrences
qui sont compares) :
string s1="Bonjour", s2="Hello";
if (s1 == s2) ..... // les deux chanes ont-elles les mmes contenus ?
if (s1 == "Bonjour") ..... // la chane a-t-elle Bonjour comme contenu ?
Les oprateurs == et != appellent en fait la mthode Equals de la classe String.
Mthodes principales de la classe String :

36

Programmation oriente objet

M.CHAKOUJ

37

Programmation oriente objet

M.CHAKOUJ

XII.

Les structures :

Les classes encapsulant les types lmentaires dans .NET Framework sont des classes de type valeur du genre
structures. Dans le CLS une classe de type valeur est telle que les allocations d'objets de cette classe se font
directement dans la pile et non dans le tas, il n'y a donc pas de rfrence pour un objet de type valeur et
lorsqu'un objet de type valeur est pass comme paramtre il est pass par valeur.
Constructeur :
Les classes-structures de type valeur peuvent comme les autres classes possder un constructeur explicite (pas
de constructeur sans paramtre), qui comme pour tout classe C# doit porter le mme nom que celui de la
classe-structure.
Dclaration de classe-structure :
struct StructPerso {
public int a;
private string chaine;
public void meth( int x){
.... corps de la mthode
}
public StructPerso (int a,string chaine ){
.... corps du constructeur
}
}
Instanciation :
StructPerso y = new StructPerso (2,dadi ) ;
Exemple :
using System;
struct Eleve
{ public string refEleve;
public Eleve(string nom, string prenom)
{
refEleve=nom+", "+prenom;
}
}
class Exercice
38

Programmation oriente objet

M.CHAKOUJ

{
public static void Main( )
{
Eleve etudiant = new Eleve("Dumas","Alexandre");
Console.WriteLine("identit : "+etudiant.refEleve);
Console.ReadLine();
}
}

Structures et classes :
Structures et classes ont beaucoup de choses en commun (notamment des mthodes qui peuvent tre
implmentes comme membres de la structure). Structures et classes prsentent nanmoins des diffrences
notables.
Les variables structures sont de type valeur (comme int, float, etc., mais pas les string) tandis que les
vritables objets (variables dune classe) sont de type rfrence .
Les structures ne peuvent hriter daucune classe ou structure et ne peuvent servir de base pour aucune
classe ou structure drives.
Les champs dune structure ne peuvent pas tre explicitement initialiss dans la dfinition mme du champ
(contrairement aux champs dune classe).
Une structure peut contenir zro, un ou plusieurs constructeurs mais pas de constructeur par dfaut
(autrement dit, pas de constructeur sans argument).
Une variable structure peut tre cre comme nous lavons fait prcdemment mais galement par new.
XIII.
Les numrations
Un type particulier que nous allons galement utiliser est lnumration. Cela correspond
comme son nom lindique une numration de valeurs(ici lnumration EtatCivil qui comprend quatre
valeurs) :
//dclaration du type
enum EtatCivil {
Clibataire,
Mari,
Divorc,
Veuf
}
.....
EtatCivil ec; // dclaration dun variable ec de type EtatCivil
Console.WriteLine("donnez l'tat civil de la personne");
Enum.TryParse (Console.ReadLine(),true, out ec); //true pour ne pas respect la casse
//(Majuscule et minuscule)
switch (ec)
{
case EtatCivil.Clibataire :
Console.WriteLine("Clibataire"); break;
case EtatCivil.Mari :
Console.WriteLine("Mari"); break;
case EtatCivil.Divorc :
Console.WriteLine("Divorc"); break;
case EtatCivil.Veuf :
Console.WriteLine("Veuf"); break;
}
Ou bien if(ec== EtatCivil.Clibataire) Console.WriteLine("Clibataire");
39

Programmation oriente objet

M.CHAKOUJ

else if..
La premire ligne (dfinition enum) doit tre place dans la classe mais en dehors dune fonction(ou dans un
autre fichier ) .
La dfinition enum peut tre termine par un point-virgule mais cela nest pas obligatoire.
Une numration est un type dont toutes les valeurs dfinies sont des entiers. La premire vaut 0, et chaque
valeur suivante prend la valeur prcdente augmente de 1. Cest--dire que Clibataire vaut 0, Mari vaut 1,
etc.
XIV.

Les fichiers texte en C# :

1. Crer un fichier
Cration sur le disque dur d'un fichier vide au format Unicode en utilisant un flux de type StreamWriter.
using System ;
using System.IO ;
class CreerUnFichierTexte
{
static void Main ( string [ ] args )
{
StreamWriter fluxWrite = new StreamWriter ("c:\\essai.txt");
Console.WriteLine ("Fichier essai.text cr sur le disque dur.");
Console.WriteLine ("Il crase les donnes dj prsentes");
Console.ReadLine ();
}
2. Tster la prsence dun fichier
Si le fichier essai.txt n'est pas dj prsent sur le disque dur, on le cre en utilisant un flux de type
StreamWriter, s'il est dj prsent on envoi un message console et l'on n'crase pas le fichier dj prsent. Il
faut utiliser la classe System.IO.File qui ne contient que des mthodes static pour la manipulation, la lecture
et l'criture de fichiers sur disque et en particulier la mthode "public static bool Exists ( string path )" qui
permet de savoir si un fichier existe physiquement partir d'un chemin complet pass en paramtre :
using System ;
using System.IO ;
class CreerUnFichierTexte
{
static void Main(string[ ] args)
{
if ( !File.Exists("c:\\essai.txt") )
{
StreamWriter fluxWrite = new StreamWriter("c:\\essai.txt");
Console.WriteLine("Fichier essai.text cr sur le disque dur.");
Console.WriteLine("Il n'crase pas les donnes dj prsentes");
}
else
Console.WriteLine("Fichier essai.text dj prsent sur le disque dur.");
Console.ReadLine();
/*
Afin de tester le programme effacez physiquement le fichier c:\essai.txt
*/
}}
3. Lire et ecrire dans un fichier texte
Si le fichier essai.txt n'est pas dj prsent sur le disque dur, on le cre et on crit des donnes dedans, s'il est
dj prsent on le lit et on affiche son contenu.
using System ;
40

Programmation oriente objet

M.CHAKOUJ

using System.IO ;
class CreerUnFichierTexte
{
static void Main(string[ ] args)
{
if ( !File.Exists("c:\\essai.txt") )
{
StreamWriter fluxWrite = new StreamWriter("c:\\essai.txt");
Console.WriteLine("Fichier essai.text cr sur le disque dur.");
Console.WriteLine("Il n'crase pas les donnes dj prsentes");
for(int i=1; i<10; i++)
fluxWrite.WriteLine("texte stock par programme ligne N : "+i);
fluxWrite.Close();
}
else
{
Console.WriteLine("Contenu du fichier essai.text dj prsent :");
StreamReader fluxRead = new StreamReader("c:\\essai.txt");
string ligne;
while((ligne = fluxRead.ReadLine()) != null)
Console.WriteLine(ligne);
fluxRead.Close();
}
Console.ReadLine();
}
/*
Afin de tester le programme effacez
physiquement le fichier c:\essai.txt */ }
4.Recopier tout vers un fichier test
Si le fichier essai.txt n'est pas dj prsent sur le disque dur, on le cre et on crit des donnes dedans, s'il est
dj prsent on le lit et on affiche son contenu. Dans cette version identique au prcdent on utilise
l'instruction de bloc using.
using System ;
using System.IO ;
class CreerUnFichierTexte
{
static void Main(string[ ] args)
{
if ( !File.Exists("c:\\essai.txt") )
{
using (StreamWriter fluxWrite = new StreamWriter("c:\\essai.txt"))
{
Console.WriteLine("Fichier essai.text cr sur le disque dur.");
Console.WriteLine("Il n'crase pas les donnes dj prsentes");
for(int i=1; i<10; i++)
fluxWrite.WriteLine("texte stock par programme ligne N : "+i);
}
}
else
{
Console.WriteLine("Contenu du fichier 'essai.text' dj prsent :");
using (StreamReader fluxRead = new StreamReader("c:\\essai.txt"))
{
41

Programmation oriente objet

M.CHAKOUJ

string ligne;
while((ligne = fluxRead.ReadLine()) != null)
Console.WriteLine(ligne);
Console.WriteLine("\nRecopie en cours ...");
}
using (StreamReader fluxRead = new StreamReader("c:\\essai.txt"))
{
StreamWriter fluxWrite = new StreamWriter("c:\\copyEssai.txt");
string ligne;
while((ligne = fluxRead.ReadLine()) != null)
fluxWrite.WriteLine("copie < "+ligne+" >");
fluxWrite.Close ();
}
using (StreamReader fluxRead = new StreamReader("c:\\copyEssai.txt"))
{
Console.WriteLine("\nContenu de la copie 'copyEssai.txt' :");
string ligne;
while( (ligne = fluxRead.ReadLine( ) ) != null)
Console.WriteLine(ligne);
}
}
Console.ReadLine();
}
/*
Afin de tester le programme effacez
physiquement le fichier c:\essai.txt
*/
}

42

Programmation oriente objet

M.CHAKOUJ

TP2
Exercice 1 :
Soit la classe Stagiaire qui modlise un stagiaire et qui comporte les attributs suivants :
codeStagiaire int
non String
prenom String
niveau int
1) Codage de la class Stagiaire :
a. Ecrire la class Stagiaire
b. Ajouter un constructeur sans argument.
c. Ajouter un constructeur qui initialise tous les attributs de la classe Stagiaire.
d. Ajouter une mthode affichage() qui affiche la description du stagiaire.
2) Codage de la classe Program :
-Crer le stagiaire Slimani Abbas ,ayant le code 123,1re anne.
-Crer un tableau contenant 5 instance de la classe stagiaire(leurs informations seront saisies au
clavier) en plus du stagiaire Slimani.
-Afficher les donnes de ces stagiaires.
Exercice 2 :
On souhaite grer la rpartition des modules entre les formateurs dun institut de formation
professionnelle.
Soit la classe module qui modlise un module et qui comportera les attributs suivants :
rfrence
intitule
formateur (matricule du Formateur qui enseigne ce module)
Soit la classe Formateur qui modlise un Formateur et qui comportera les attributs suivants :
matricule
nom
prenom
sexe (M,F)
age
spacialit
echelle
Salaire_brut
NbreHeuresSup
Taux_horaire
Taux_IGR
Travail faire :
1- Codage de la classe Module
a- Ecrire la classe Module .
b- Ajouter un constructeur sans argument qui initialise lattribut rfrence de la class Module ; la
rfrence doit avoir la valeur du compteur.
c- Ajouter un constructeur qui initialise tous les attributs de la classe Module.
d- Ajouter cette classe une mthode description() qui retourne les valeurs des attributs
spares par un espace.
e- Ajouter cette classe une mthode afficherInfo() qui affiche la rfrence et lintitul.
2- Codage de la classe Formateur
a. Ecrire la classe Formateur avec un compteur des objets crs.
b. Ajouter cette classe une mthode Description() qui retourne les valeurs des attributs
spares par un espace.
c. Ajouter une mthode permettant de calculer le salaire Net payer pour un Formateur
donn, sachant que :
43

Programmation oriente objet

M.CHAKOUJ

SalaireNet = [SalaireBrut + (NbreheuresSup * Taux_horaire)] * (1 Taux_IGR)


3. Codage de la classe de test Program :
a. Dclarer un vecteur de type Module
b. Dclarer un vecteur de type Formateur.
c. Crer 4 instances de la classe Module.
-pour la premire instance les valeurs des attributs seront initialiss par vous ;
-pour la deuxime instance les valeurs des attributs seront donnes par lutilisateur.
d. Crer 2 instances de la classe Formateur
e. Ecrire une mthode qui affiche le formateur qui enseigne un module dont la rfrence est pass en
paramtre
f. Ecrire une mthode qui affiche tous les modules enseigns par un formateur dont le matricule est
pass en paramtre.
.
Exercice 3 :
1. Crer une Classe ou une Structure Point ayant les champs x, y et ventuellement
des
constructeurs . Ajouter une mthode permettant de calculer la distance lorigine
(x2+y2) .
2. Ajouter une autre mthode permettant dafficher les coordonns dun point donn et
la
distance lorigine .
3. Ecrire un programme de test pour crer deux points A(12,10) et B(4, 3), et
afficher leurs coordonns et la distance lorigine.
4. Affecter les coordonns de B A et afficher les nouvelles informations du point A.
Exercice 4 :
La socit AlphGet souhaite dvelopper une solution pour la gestion des voyages dune agence de transport.
Le responsable dsire avoir la possibilit de mettre jour quotidiennement les voyages de lagence.
Les classes utilises dans cette application sont :
Travail faire :
Vhicule

Chauffeur

Voyage

codeVehicule
Immatriculation
DateCirculation

codeChauffeur
nomChauffeur
PrenomChauffeur
dateRecrutement

codeVoyage
dateVoyage
HeureDpart
HeureArrive
villeDpart
villeArrive
codeChauffeur
codeVehicule

1. Crer la classe vhicule avec les


constructeurs, accesseurs et
modificateurs
2. Crer la classe chauffeur avec les
constructeurs, accesseurs et
modificateurs
3. Crer la classe Voyage avec les
constructeurs, accesseurs et
modificateurs

4.Dans la classe programme dclarer une liste de


Voyages.
5.Ecrire une mthode qui affiche les voyages assurs par un chauffeur dont le nom est pass en paramtre.
6.Ecrire une mthode qui permet de reporter un voyage.
7.Ecrire une mthode qui permet de changer le vhicule affect un voyage.
8. Ecrire une mthode qui affiche les voyage affects au vhicule 1234 lanne 2011.
44

Programmation oriente objet

M.CHAKOUJ

9. Ecrire une mthode qui affiche les informations des chauffeurs recruts ces 3 dernire anne.
10. Ecrire une mthode qui affiche les voyages a destination de Agadir aujourdhui.
Exercice 5 :
On dsire raliser un programme permettant de calculer les caractristiques dun cylindre de Rayon R et de
Hauteur H.
1. Le programme est constitu dune classe Cylindre contenant les mthodes suivantes :
GetRayon() : Retourne le Rayon saisi par lutilisateur
GetHauteur() : Retourne la hauteur saisie par lutilisateur
CalculSurface() : Calcule la surface du cylindre (3.14*R*R)
CalculSurfaceLaterale() : Calcule la surface latrale du cylindre (3.14*R*H)
SurfaceTotale() : Calcule la surface totale du cylindre [3.14*R*(H+R)]
Volume() : Calcule le volume du cylindre (3.14*R*R*H)
2. crire une mthode main, qui cre une instance de la classe cylindre , et qui demande lutilisateur de saisir
le Rayon et la Hauteur et affiche ces caractristiques.

45

Programmation oriente objet

M.CHAKOUJ

Chapitre 5 : Accesseurs , Proprits ,et membres static


I.
Mthodes de lecture et d'criture des attributs privs :
Sont appeles aussi (accesseurs)(getters and setters).
Nous rajoutons la classe Personne les mthodes ncessaires pour lire ou modifier l'tat des attributs des
objets cres lextrieur de la classe :

Maintenant aller la mthode Main() de la classe programme crer une instance p1 de la classe
Personne .Pour affecter la chaine Hammadi son attribut nom (accs en criture)on va utiliser SetNom()
,et pour lafficher lcran (accs en lecture)on va utiliser GetNom().

Il existe une autre faon d'avoir accs aux attributs d'une classe, c'est de crer des proprits. Celles-ci nous
permettent de manipuler des attributs privs comme s'ils taient publics .
46

Programmation oriente objet

M.CHAKOUJ

II.
Les proprits
Une proprit permet de lire (get) ou de fixer (set) la valeur d'un attribut. Une proprit est dclare comme
suit :
Public Type NomProprit {
get {...}
set {...}
}
o Type doit tre le type de l'attribut gr par la proprit. La mthode get est habituellement charge de
rendre la valeur de l'attribut qu'elle gre (elle pourrait rendre autre chose, rien ne l'empche). La mthode set
reoit un paramtre appel value qu'elle doit affecter normalement l'attribut qu'elle gre. Elle peut en
profiter pour faire des Vrifications sur la validit de la valeur reue et ventuellement lancer une exception
(chapitre 9) si la valeur se rvle invalide.
Prenons un exemple pour illustrer les proprits. Le prix renseign dun produit (proprit Prix) est multipli
par deux quand la quantit en stock est infrieure dix units. La proprit prsente lavantage dtre aussi
simple utiliser quune variable, tout en ayant la puissance dun appel de fonction.
Ce sont aussi les proprits qui permettent dcrire des expressions telles que DateTime.Now.DayOfYear
(nous en rencontrerons bien dautres tout au long de ce policopie). Nous commenterons le programme par la
suite :
using System;
class Produit
{
public Produit(int q, int p) {
m_Qtit = q; m_Prix = p;
}
public void Entre(int qtit) {
m_Qtit += qtit;
}
public void Sortie(int qtit) {
m_Qtit -= qtit;
}
int m_Qtit;
int m_Prix;
// proprit Prix
public int Prix {
get {
return m_Qtit<10 ? m_Prix*2 : m_Prix;
}
set {
m_Prix = value;
}
}
}
Testons la proprit Prix :
class Program
{
static void Main()
{
Produit p = new Produit(8, 100);
p.Entre(15); //15 produit en stock
p.Sortie(10); // cinq produits en stock
47

Programmation oriente objet

M.CHAKOUJ

Console.WriteLine("Prix unitaire actuel : " + p.Prix);


}
}
Prix est une proprit de la classe Produit. Lors de lexcution de :
n = p.Prix;//accs en criture
la fonction accesseur en lecture (partie get) de la proprit est automatiquement appele et n prend la valeur
renvoye par cette fonction.
Lors de lexcution de :
p.Prix = 50;//Accs en criture
la fonction daccs en criture (partie set) de la proprit est excute, avec value (mot rserv) qui prend
automatiquement la valeur 50.
Depuis la version 2, un accesseur de proprit peut tre qualifi de protected ou de public (ce qui est le cas par
dfaut). Par exemple :
class A
{
public string Prop
{
get { ..... }
protected set { ..... }
}
}
Il est possible de lire la proprit Prop dun objet partir de classes extrieures A. La modification reste
nanmoins possible partir de fonctions membres de la classe A.
C# version 3 (Visual Studio 2008) a ds lors introduit une syntaxe simplifie, qui ne sapplique qu ce
cas simple mais nanmoins courant :
class Pers
{
public string Nom { get; set; }
.....
}
On parle dans ce cas de proprit auto-implmente.
Le compilateur gnre automatiquement le champ priv correspondant la proprit (mais celui-ci reste
inaccessible par votre code C#) ainsi que les instructions (simples) correspondant au get et au set. Si vous avez
besoin dinstructions plus labores (mme uniquement dans le get ou le set), il vous appartient dcrire la
proprit lancienne .
Remarque :
Une autre caractristique des proprits est qu'elles peuvent tre utilises conjointement avec un constructeur
selon la syntaxe suivante :
Classe objet=new Classe (...) {Proprit1=val1, Proprit2=val2, ...}
Cette syntaxe est quivalente au code suivant :
Classe objet=new Classe(...);
objet.Proprit1=val1;
objet.Proprit2=val2;
...
Exemple :
Personne p = new Personne () { _Nom="Ahmadi",_Prenom="salem",Age=25};
III.
Les mthodes et attributs de classe : le mot cl static
On veut compter les objets Vhicules crs par une application, pour se faire on doit inclure dans la classe un
compteur nbVehicule comme attribut puis on lincrmente chaque cration dun nouveau instance (donc
dans tous les constructeurs). Mais malheureusement chaque cration dobjet Vhicule lattribut prend la
valeur 1, tous a est d du faite que lattribut nbVehicule est un attribut dinstance, pour remdier ce
48

Programmation oriente objet

M.CHAKOUJ

problme on doit dclarer nbVehicule comme attribut de classe (partag par tous les instance crs de la classe)
la syntaxe est la suivante:
private static int nbVehicule;

Testons notre classe dans Main() :

49

Programmation oriente objet

M.CHAKOUJ

Lattribut nbVehicule est appel directement par la classe sans faire recours une instanciation car il est
dclar par le mot cl static cest un attribut de classe . La mthode societ() est appele directement par la
classe sans faire recours a une instanciation car elle est dclar par le mot cl static cest une mthode de
classe.
En bref :
Un champ statique dune classe :
existe indpendamment de tout objet de la classe et existe mme si aucun objet de la classe
na encore t cr ;
est partag par tous les objets de la classe ;
est accessible par c.ch o c dsigne le nom de la classe et ch le nom du champ statique (autrement dit par le
nom de la classe suivi dun point suivi du nom du champ) ;
peut tre initialis et manipul dans une mthode de la classe comme cest le cas pour nimporte quel champ.
Une mthode statique peut tre appele mme si aucun objet de la classe na encore t cr : appelez une
telle mthode par X.g() (sans oublier les arguments) o X dsigne le nom de la classe et g le nom de
la mthode statique (WriteLine de la classe Console est un exemple de fonction statique).
50

Programmation oriente objet

M.CHAKOUJ

Les mthodes statiques et non statiques doivent respecter les rgles suivantes.
Une mthode statique na accs quaux champs statiques de sa classe ;
.
Une mthode statique peut appeler une autre mthode statique (de sa classe ou dune autre)
mais ne peut pas appeler une mthode non statique.
Une mthode non statique dune classe a accs la fois aux champs statiques et aux champs non statiques de
sa classe.
Remarque : sin() et cos()..sont des mthodes statiques de la classe Math,pour les appeler
Math.Sin(x) et Math.Cos(y)

51

Programmation oriente objet

M.CHAKOUJ

TP3
Exercice 1 :
Un commerant dsire automatiser la gestion des commandes de ces clients. Il dsire avoir la possibilit de
mettre jour quotidiennement ces commandes clients.
Pour grer les commandes, il a besoin des donnes cites ci-dessous :

1- Crer la classe Produit avec ventuellement des constructeurs et des accesseurs


a-Proposer une solution pour forcer le CodePro tre unique.
2- Crer la classe Commande avec ventuellement des constructeurs et des proprits.
a-Proposer une solution pour forcer le NC tre unique.
b- la date de la commande est celle daujourdhui.
3-Codage de la classe de test Program :
a. Crer un tableau contenant 4 produits.
b. Crer une instance de la classe commande.
c. La commande cre concerne les deux premiers produits avec les quantits respectives 123 et 222.
Crer les instances ncessaires de la classe DtailsCommande ( stocker dans un tableau).
d. Calculer le montant de la commande en DH.

52

Programmation oriente objet

M.CHAKOUJ

Exercice 2 :
on souhaite dvelopper une application pour la gestion dun club sportif.
Un adhrent peut sinscrire pour pratiquer diverses disciplines (Natation, Musculation, Arts martiaux).
Lors de linscription, ladhrent fournit les informations suivantes :
Nom
Prnom
Adresse
Date de naissance
Code didentification. (gnr automatiquement par lapplication)
Discipline(s) choisie (s).
Toutes les disciplines sont dfinies par un code, un nom et une description.
Travail faire :
1) Dvelopper une classe Adherent, avec les constructeurs adquats, les proprits, et une mthode
daffichage Affchei_adherent(.)
2) Dvelopper une classe Disciplines, avec les constructeurs adquats, les proprits, et une mthode
daffichage Affchei_Disciplines(.)
3) Dvelopper une mthode Saisie_Adherent(.) permettant de saisir au clavier les informations dun
nouveau adhrent et de lajouter la liste des adhrents.
4)Dvelopper une mthode Choix_Disciplines(.) permettant un un adhrent donn, de choisir une au
plusieurs disciplines. Ladhrent ne peut choisir que une des disciplines cites dans lnonc .
5)Ecrire une mthode qui calcule le nombre dadhrent ayant choisis une discipline dont le code est pass en
paramtre.
Exercice 3 :

53

Programmation oriente objet

M.CHAKOUJ

6.Ecrire une mthode qui affiche les visites dun patient (avec info patient)
7. Ecrire une mthode qui supprimer les rendez-vous dont la date est antrieure aujourdhui.
8. Ecrire une mthode qui affiche les rendez-vous daujourdhui.
9. Ecrire une mthode qui affiche les rendez vous rats ou annuls.

54

Programmation oriente objet

M.CHAKOUJ

Chapitre 6 : Lhritage et le polymorphisme

I.

Lhritage

1. Dfinition :
Lhritage est une approche puissante pour la rutilisation du code. Comme toute technique de rutilisation,
elle facilite la maintenance, amliore la productivit et permet de mieux structurer votre programme.
Lhritage permet de construire une classe B partir dune classe existante A. Il sagit dune sorte dhritage
biologique. La classe B va ainsi hriter des variables, des mthodes, bref de tous les membres de A puis, on va
ajouter des lments supplmentaires propres la classe B.
Un hritage entre plusieurs classes fait natre une notion de hirarchie. Si B hrite de A, on dit que B est une
classe fille, une sous-classe, une classe enfant ou encore une classe drive de A. Dune autre manire, A se
nomme la classe mre, la classe de base, la classe parent ou encore la super classe de B.
On peut examiner une hirarchie de classes de deux faons diffrentes. On peut choisir une vision par
spcialisation/redfinition. Dans ce cas, la classe B est vue comme un cas particulier de la classe A. Par
exemple, un 4x4 est un cas particulier dune Voiture. Dans cette vision, lensemble des Voitures est
lensemble englobant et les 4x4 reprsentent un sous-ensemble des Voitures. Un autre point de vue est celui
de lextension. La classe B est vue comme une version tendue de la classe A. Par exemple, un 4x4 est une
voiture disposant de 2 roues motrices supplmentaires. Du point de vue des fonctionnalits, la classe 4x4
englobe les fonctionnalits de la classe Voiture, la classe Voiture a moins de paramtres internes que la classe
4x4.

Les avantages majeurs de ce procd tant la possibilit daffiner vos classes tout en prservant lintgrit des
classes parentes, de capitaliser votre travail au fur et mesure de vos dveloppement en construisant vos
librairies de classes (permettant ainsi de constituer votre framework).
Rgles :
- Il ne peut y avoir quune seule classe parent. Lhritage multiple est interdit.
- Les cycles sont interdits : A ne peut hriter de B si B hrite dj de A.
2. Syntaxe :
Pour spcifier qu'une classe est drive d'une autre classe, utilisez la syntaxe suivante :

Classe NomclasseFille : NomClasseParente


55

Programmation oriente objet

M.CHAKOUJ

{
//Le code de la classe ClasseFille
}

Exemple :
//dfinition de la super classe Vehicule
class Vehicule
{
Private string nom;
public void Setnom(string nom){ this.nom=nom ;};
public void AfficheNom()
{
Console.WriteLine(nom);
}
}
//dfinition de la classe drive Voiture
class Voiture : Vehicule
{
//attribut en plus de ceux de Vehicule que Voiture possde
Private int puissance ;
public void Setpuissance(int puissance){ this.puissance=puissance ;};
//une deuxime mthode en plus de AfficheNom()
public void Info()
{
Console.WriteLine(nom);
Console.WriteLine(puissance);
}
}
La classe programme :
static void Main(string[] args)
{
//cration dun objet de la super classe
Vehicule V = new Vehicule();
V.Setnom(Proto);
V.AfficheNom();
//cration dun objet de la classe drive
Voiture K = new Voiture();
K.Setnom (Buggy);
K.Setpuissance (4) ;
K.Info() ;
K.AfficheNom() ;
}
Attention :
56

Programmation oriente objet

M.CHAKOUJ

Les instructions suivantes sont fausses et engendrent des erreurs :


V.setpuissance( 4);
V.Info();
car puissance et info()sont des membres de la classe drive, donc un objet de la super classe ne les possde
pas.
Remarque :
-Lexplorateur dobjets de VS2008 permet de voir la hirarchie en classe de toute classe du framework .net
-le mot clef sealed prcdant le mot clef class permet dempcher lextension dune classe,en parle dune
classe sans hritire.
-Pas d'hritage pour les structures: Dans .NET Framework les classes-structures de type valeur sont dclares
comme structures et ne sont pas drivables.
X is Voiture // renvoie true si X est du type Voiture
-soit linstruction suivante :
Franais f = Conjoint as Franais;
if (f != null) ..... // il sagit dun Franais
Le mot rserv as effectue une tentative de transtypage de Conjoint (dfini de type Personne) en Franais
(classe drive de Personne). Si la tentative russit (parce que le conjoint est effectivement un Franais), f
prend une valeur non nulle et fait rfrence au conjoint. Sinon, f prend la valeur null.
3. Constructeurs et chanage
Le constructeur de la sous-classe appelle toujours celui de la classe de base, implicitement ou explicitement.
Si rien n'est spcifi, le compilateur gnre un appel implicite au constructeur de la classe de base ne
comportant aucun paramtre. C'est pourquoi ce constructeur est nomm constructeur par dfaut . Si la
classe de base ne possde aucun constructeur par dfaut, ou si un autre serait plus appropri, il est possible de
spcifier explicitement le constructeur appeler. Le mot-cl base dsigne la classe de base.
Prenons une classe Employe enfant dune classe Personne. Lors de lcriture de ses constructeurs
paramtriques ou sans arguments de la classe Employe, on doit se poser la question de comment va-t-on grer
la construction des lments provenant de Personne.
Exemple :

Soit la classe Employe drive de la classe Personne :

57

Programmation oriente objet

M.CHAKOUJ

Le mot clef base sert appeler explicitement le constructeur de la classe mre de Employe. Le
constructeur de la classe parent fait ce quil doit faire : vrification / affectation / initialisation des attribut
nom,prenom,age et nous faisons dans le constructeur de Employe uniquement ce qui concerne la classe
Employe (c'est--dire linitialisation de lattribut salaire).
Question : dans quel ordre sont lancs les constructeurs ?
class A
{
public A() { WriteLine(construction de A); }
}
class B : A
{
public B() : base() { WriteLine(construction de B); }
}
Linstruction :
B toto = new B() ;
Engendre laffichage suivant :
construction de A
construction de B
Le constructeur de la classe parent est lanc AVANT les instructions du constructeur de la classe B. Si la
classe A possde un parent, son constructeur sera appel avant que celui de A soit excut. Au final, cest le
constructeur du parent initial dans la hirarchie qui sera le premier lanc, puis ceux de ses enfants
successivement. Ce comportement logique provient du fait que pour fonctionner, la classe B peut ncessiter
des ressources venant de sa classe mre.
Attention :
Lors de la construction de B, le fait que le constructeur de A soit appel ne veut pas dire quun objet de type A
est cr mais que les membres hrits de A dans B sont initialiss. Au final, il ny a bien quun seul objet de
type B de cr.
4. Rfrence d'instance
Une rfrence une instance de la sous-classe peut tre stocke par une rfrence du mme type : Employe
Emp1 = new Employe(); Il est galement possible d'utiliser une rfrence du type de la classe de base :
Personne Emp2 = new Employe().
Q) Quelles diffrences ?
II.

polymorphisme

58

Programmation oriente objet

M.CHAKOUJ

1. Principe
Le terme polymorphisme dsigne la capacit dune mthode pouvoir prendre un comportement diffrent
suivant le contexte (les types utiliss). Ainsi nous pouvons obtenir des implmentations plus gnrales, mieux
structures et plus simples comprendre.
Ainsi une fonction peut exister sous le mme nom dans une hirarchie mais avoir un comportement diffrent
suivant le type de lobjet instanci. On parle alors de polymorphisme dhritage.
2. Mise en place
Le polymorphisme dhritage est garanti si lon utilise une syntaxe particulire. La premire classe o la
mthode est dclare pour la premire fois (la super classe)doit porter le qualificatif virtual et toutes les
classes enfants modifiant son comportement doivent prcder sa dclaration par le qualificatif override.
class A {
public virtual void Aff() { WriteLine(Bonjour);
}
}
class B : A { }
class C : B {
public override void Aff() { WriteLine(Coucou); }
}
class D : C { }
Remarques :
Rem 1 : le mot clef override est obligatoire pour redfinir une fonction virtuelle.
Rem 2 : on peut utiliser le mot clef final pour empcher toute redfinition.
3. Chainage des redfinitions
Il est toujours possible dappeler la fonction qui a t redfinie partir de la redfinition avec le mot cl base.
Cela permet de construire des chaines de fonctions dans le mme principe que le chainage des constructeurs.
Par exemple, supposons que la classe Voiture dispose dune fonction TestAllumage() qui vrifie que tous les
composants lectriques (ordinateur de bord, ABS, ESP, air bag, ...) de la voiture fonctionnent bien. Dans le
cas dun Cabriolet qui ajoute un toit amovible, il faudra contrler lensemble des systmes dune voiture
simple et le systme qui rentre/sort le toit amovible.
class Cabriolet : Voiture
{
public override void TestAllumage()
{
base() ; // test des lments de la classe Voiture par appel a TestAllumage() de Voiture
testToitAmovible() ; // test des lments spcifiques au Cabriolet
...
}
}
Exemple :
public class Vehicule
{
private int poids;
public Vehicule(int poids) {
this.poids = poids;
}
public virtual string Description() {
return "Vhicule de "+poids+" tonnes";
}
}
59

Programmation oriente objet

M.CHAKOUJ

Et il faut utiliser le mot cl override dans la classe drive :


public class Automobile : Vehicule
{
private string couleur;
public Automobile(int poids,string couleur) : base(poids) {
this.couleur = couleur;
}
// mthode surcharge
public override string Description() {
return base.Description()+" de couleur "+couleur;
}
}
Utilisation :
Vehicule vehicule = new Automobile(3, "rouge");
Console.WriteLine( vehicule.Description() ); // affiche : Vhicule de 3 tonnes de couleur
//rouge
Si le mot cl new est utilis la place du mot cl override, le polymorphisme n'est pas effectif.

60

Programmation oriente objet

M.CHAKOUJ

TP4
Exercice 1 :
Soit les classes suivantes :

Crer les classes : Personnel et Enseignant, sachant que la classe Enseignant hrite de la classe Personnel.
Ajouter des constructeurs et des proprits .
2.Ajouter une mthode afficher() qui affiche dans une ligne les informations relatives un personnel
3.Redfinir la mthode toString() dans la super classe Personnel,et dans la sous classe Enseignant.
4.Redfinir la mthode afficher() dans la sous classe Enseignant.
5.Crer les classes Etudiant et Module avec ventuellement des constructeur et des proprits
6.Ajouter une mthode permettant de calculer le salaire Net payer pour un Enseignant
donne, sachant que :
SalaireNet = [SalaireBrut + (NbreheuresSup * Taux_horaire)] * (1 - Taux_IGR)
Exercice 2 :

61

Programmation oriente objet

M.CHAKOUJ

62

Programmation oriente objet

M.CHAKOUJ

Chapitre 7 : Classe abstraite et Interface

I.

Classe abstraite :

1. Le mot cl abstract et mthode abstraite :


Le mot clef abstract est utilis pour reprsenter une classe ou une mthode abstraite. Lintrt de cette
notion et davoir des modles gnriques permettant de dfinir ultrieurement des actions spcifiques.
Une mthode dclare en abstract dans une classe :
N'a pas de corps de mthode.
N'est pas excutable.
Doit obligatoirement tre redfinie dans une classe fille.
Une mthode abstraite n'est qu'une signature de mthode sans implmentation dans la classe. En C#, les
mthodes abstraites sont automatiquement virtuelles, elles ne peuvent tre dclares que public ou protected,
enfin elles doivent tre redfinies avec le qualificateur override.
2. Classe abstraite :
Une classe abstraite est une classe non instanciable . Il faut crer des classes drives qui elles pourront tre
instancies. On peut utiliser des classes abstraites pour factoriser le code d'une ligne de classes.
Exemple :
//la classe abstraite Etre_Vivant
abstract class Etre_Vivant {
//la mthode abstraite SeDeplacer( )
public abstract void SeDeplacer( );
}
//classe Serpent drivant de la classe Etre_Vivant
class Serpent : Etre_Vivant {
//Implmentation de la mthode SeDeplacer( )
public override void SeDeplacer( ) {
//....en rampant
Console.WriteLine(je me dplace en rampant) ;
}
}
//autre classe fille
class Oiseau : Etre_Vivant {
public override void SeDeplacer( ) {
//.....en volant
Console.WriteLine(je me dplace en volant) ;
}
}
//autre classe fille
class Homme : Etre_Vivant {
public override void SeDeplacer( ) {
//.....en marchant
63

Programmation oriente objet

M.CHAKOUJ

Console.WriteLine(je me dplace en marchant) ;


}
}
Remarques :
1- une classe abstraite ne peut pas tre instancie, ce qui ne lempche pas de possder un ou plusieurs
constructeurs appels par le mcanisme de chanage des constructeurs.
3 -une classe non abstraite fille dune classe abstraite doit implmenter toutes les mthodes abstraites de sa
classe mre.
4 -vous pouvez crer une sous-classe abstraite dune classe (abstraite ou non). Dans tous les cas, il faudra
alors qualifier explicitement cette sous classe dabstraite.
5- une classe drive qui redfinit toutes les mthodes abstract de la classe mre sauf une (ou plus d'une) ne
peut pas tre instancie et subit la mme rgle que la classe mre : elle contient au moins une mthode
abstraite donc elle est aussi une classe abstraite et doit donc tre dclare en abstract.
6- Une classe abstract peut contenir des mthodes non abstraites et donc implantes dans la classe.
II.
Interfaces :
Une interface est un ensemble de prototypes de mthodes ou de proprits qui forme un contrat. Une classe
qui dcide d'implmenter une interface s'engage fournir une implmentation de toutes les mthodes dfinies
dans l'interface. Cest le compilateur qui vrifie cette implmentation.
Une interface est dfinie de manire similaire une classe mais elle ne contient que des prototypes de
fonctions sans qualificateur de visibilit. Cest la classe implmentant linterface qui choisit leurs visibilits.
Une classe peut hriter de plusieurs interfaces et dans ce cas nous avons une excellente alternative l'hritage
multiple.
Exemple :
interface IVehicule
{
void Demarrer( );
void RpartirPassager( );
void PriodicitMaintenance( );
}
//Une classe abstraite implmentant cette interface :
class Terrestre : IVehicule
{
public void Demarrer( ){
//le code ici
};
public void RpartirPassager( ){
//le code ici
}
public void PriodicitMaintenance( ){
//le code ici
..
}
}
Comparaison entre une interface et une classe abstraite :
Les interfaces ressemblent aux classes abstraites sur un seul point : elles contiennent des membres
expliquant certains comportements sans les implmenter.
Les classes abstraites et les interfaces se diffrencient principalement par le fait qu'une classe peut
64

Programmation oriente objet

M.CHAKOUJ

implmenter un nombre quelconque d'interfaces, alors qu'une classe abstraite ne peut hriter que d'une seule
classe abstraite ou non.

65

Programmation oriente objet

M.CHAKOUJ

TP5
Exercice 1 :

5.Dans la classe de test :


a. Est il possible de crer une instance de la classe Equipement ?expliquer votre rponse.
b. Ecrire une mthode menu() qui propose lutilisateur de :
1. Crer un ordinateur.
2. Crer une table.
3. Crer une chaise.
4. Quiter.
Exercice 2 :
Ecrire le code correspondant ce diagramme de classes :

66

Programmation oriente objet

M.CHAKOUJ

Exercice 3 : Construction d'une hirarchie d'interface et implmentation dans une classe concrte.
On donne la hirarchie d'interfaces suivante :

Toutes les proprits sauf une, sont en lecture et en criture (la proprit isAdulte est en lecture seulement).
On se propose d'implmenter l'interface IBaleine avec la classe BaleineBosses :

Question :
Construire la classe BaleineBosses en sachant que :

Une baleine bosse met 11 mois pour devenir adulte (valeur ranger dans la constante publique
moisPourAdulte )
Chaque proprit est range dans un champ priv auquel la proprit accde en lecture et en criture.
La mthode age(int nbrMois) range l'ge de l'animal en mois dans un champ priv nomm etatAge et
positionne la proprit isAdulte true ou false selon que l'ge est plus grand ou plus petit que
moisPourAdulte.

67

Programmation oriente objet

M.CHAKOUJ

68

Programmation oriente objet

M.CHAKOUJ

Chapitre 8 : Les collections


Quand vous dveloppez des applications, vous pouvez avoir besoin de traiter et stocker de nombreuses
donnes en continu. Lutilisation des tableaux statiques pouvant tre fastidieuse et peu optimise, le
Framework .NET implmente les collections, ces classes conteneurs sont des classes qui permettent
dimplmenter des tableaux dynamiques (qui sagrandissent automatiquement), des piles, des listes chanes
ventuellement tries, etc. Les classes de collections se trouvent dans lespace du nom : System.Collections.
Toutes les collections s'appuient sur l'interface ICollection (directement ou indirectement). Dans les
collections qui s'appuient sur l'interface IList (comme par exemple Array, ArrayList ou List) ou directement
sur l'interface ICollection (comme par exemple Queue, Stackou LinkedList), chaque lment contient une
valeur uniquement. Dans les collections reposant sur l'interface IDictionary (telles que les classes Hashtable et
SortedList, ou les classes gnriques Dictionary et SortedList), chaque lment contient la fois une cl et une
valeur. La classe KeyedCollection est unique parce qu'il s'agit d'une liste de valeurs avec cls incorpores dans
les valeurs ; par consquent, elle se comporte comme une liste et comme un dictionnaire.
I.

La classe ArrayList :

1. Dfinition :
La classe System.Collections.ArrayList permet de crer des collections dobjets simple, dont
la taille sadapte automatiquement au nombre dobjets, et possdant un index. Elle hrite de la classe object et
implmente les interfaces IList, ICollection, IEnumerable, ICloneable
( public class ArrayList : IList, ICollection, IEnumerable, ICloneable;)
Remarque:
Notez que lespace de noms System.Collections (donc le using correspondant) nest pas gnr par dfaut par
Visual Studio, contrairement System.Collections.Generic (vraisemblablement une incitation lutilisation
des gnriques).
2. Mthodes :
Les principales mthodes permettant de manipuler les lments d'un ArrayList sont :

69

Programmation oriente objet

M.CHAKOUJ

Exemple :
On va travailler avec la classe personne laborer en premier chapitre.

70

Programmation oriente objet

M.CHAKOUJ

Remarque :
1-Un objet de classe ArrayList peut "grandir" automatiquement d'un certain nombre de cellules pendant
l'excution, c'est le programmeur qui peut fixer la valeur d'augmentation du nombre de cellules
supplmentaires ds que la capacit maximale en cours est dpasse. Dans le cas o la valeur d'augmentation
n'est pas fixe, c'est la machine virtuelle du CLR qui procde une augmentation par dfaut.
2-Vous pouvez utiliser le type ArrayList avec n'importe quel type d'objet puisqu'un ArrayList contient des
lments de type drivs d'object (qui la classe mre de toute classe ).
3- La capacit initiale par dfaut de ArrayList est 0. Lorsque des lments sont ajouts ArrayList, la capacit
augmente automatiquement par rallocation. La capacit peut tre diminue en appelant TrimToSize ou en
dfinissant explicitement la proprit Capacity.
4-les limitations de ArrayList:
Premirement, nous pouvions mlanger nimporte quel type dobjet dans la liste, des entiers, des voitures, des
chiens,etc. Cela devenait une classe fourre-tout et nous ne savions jamais ce quil y avait dans la liste.
Deuximement, mme si nous savions quil ny avait que des entiers dans la liste, nous tions obligs de le
traiter en tant quobject et donc dutiliser le boxing et lunboxing pour mettre les objets dans la liste ou pour
les rcuprer.

Cela engendrait donc confusion et perte de performance. Grce aux gnriques, il devenait
donc possible de crer des listes de nimporte quel type et nous tions certains du type que nous allions
rcuprer dans la liste.
II.

La classe gnrique 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 Lis est-il not Lis[i].
Exemple 1 :
Regardons cet exemple :

71

Programmation oriente objet

M.CHAKOUJ

La premire ligne permet de crer la liste dentiers. Nous ajoutons des entiers la liste grce la mthode
Add(). Nous ajoutons en loccurrence les entiers 8, 9 et 4.
La mthode RemoveAt() permet de supprimer un lment en utilisant son indice, ici nous supprimons le
deuxime entier, cest- dire 9. Enfin, nous parcourons les lments de la liste grce linstruction foreach.

a.

Exemple 2 :

72

Programmation oriente objet

M.CHAKOUJ

Exercice :
Le code suivant provoquera une erreur (pourquoi ? proposez une solution) :
List<string> jours = new List<string> { "Lundi", "Mardi","Mercredi", "Jeudi", "Vendredi", "Samedi",
"Dimanche" };
foreach (string jour in jours)
{ jour = "pas de jour !" ;}
b. Exemple 3 :

73

Programmation oriente objet

M.CHAKOUJ

3. Traiter des objets (le tri) :


a. En implmentant linterface IComparable
Soit un tableau de Personne (de type Pers), pour pouvoir le trier une premire technique consiste
implmenter linterface IComparable dans cette classe Pers.
Linterface IComparable ne comporte quune seule mthode : CompareTo() qui compare deux
objets (celui sur lequel opre la fonction et celui qui est pass en argument). CompareTo()
renvoie 0 si les deux objets sont semblables (ici, mme nom et mme ge), et une valeur positive si le premier
est suprieur au second. Dans notre cas, on compare dabord les noms et, si les noms sont identiques, les ges.
Implmenter linterface IComparable pour Pers revient nous obliger implmenter la fonction CompareTo()
dans Pers. La mthode Sort de la classe Array appellera cette mthode pour comparer deux personnes.
using System;
class Pers : IComparable
{
public string Nom { get; set; }
public int Age { get; set; }
public override string ToString() {return Nom + " (" + Age + ")";}
int IComparable.CompareTo(object o)
74

Programmation oriente objet

M.CHAKOUJ

{
Pers op = (Pers)o;
int res = Nom.CompareTo(op.Nom);
if (res == 0) res = Age - op.Age;
return res;
}
}
class Program
{
static void Main()
{
Pers[] tp = {new Pers{Nom="Prunelle", Age=35},
new Pers{Nom="Jeanne", Age=23},
new Pers{Nom="Gaston", Age=27},

new Pers{Nom="Prunelle", Age=5} };


Array.Sort(tp);
foreach (Pers p in tp) Console.WriteLine(p);
}
}
b. En dfinissant une classe de comparaison implmentant linterface IComparer :
Si lon ne dispose pas du code source de la classe Pers (puisquil faut faire implmenter linterface IComparer
Pers)il faut crer une classe implmentant linterface IComparer (interface dfinie dans System.Collections).
Linterface IComparer ne comporte quune seule mthode : Compare.
using System;
using System.Collections;
class Pers
{
public string Nom { get; set; }
public int Age { get; set; }
public override string ToString() {return Nom + " (" + Age + ")";}
}
class ComparePers : IComparer
{
public int Compare(object o1, object o2)
{
Pers op1=(Pers)o1, op2=(Pers)o2;
int res = op1.Nom.CompareTo(op2.Nom);
if (res == 0) res = op1.Age - op2.Age;
return res;
}
}
class Program
{
static void Main()
{
Pers[] tp = {new Pers{Nom="Prunelle", Age=35},
new Pers{Nom="Jeanne", Age=23},
new Pers{Nom="Gaston", Age=27},
new Pers{Nom="Prunelle", Age=5} };
Array.Sort(tp, new ComparePers());
75

Programmation oriente objet

M.CHAKOUJ

foreach (Pers p in tp) Console.WriteLine(p);


}
}
III.
Autres classes de collections :
La liste est la classe gnrique que vous utiliserez srement le plus. Mais beaucoup dautres sont votre
disposition. Citons par exemple la classe Queue<> qui permet de grer une file dattente style FIFO (first in,
first out : premier entr, premier sorti) :

Citons encore le dictionnaire dlment qui est une espce dannuaire o lon accde aux lments grce une
cl :

76

Programmation oriente objet

M.CHAKOUJ

Tandis que la classe Stack fourni une collection d'objets non plus sous forme de file mais sous forme de pile.
En effet, dans ce type de collection, nous ne pouvons ajouter des objets que via la mthode Push qui empile un
objet en haut de la pile et ne pouvons retirer des objets que via la mthode Pop qui va dpiler le dernier objet
qui a t pos sur le tas. Le schma ci-contre rcapitule le comportement d'une pile.

Note : Un index permet, dans un tableau ou dans une collection, daccder plus facilement aux donnes. La
premire position de lindex est 0 !
Voici un tableau rcapitulatif :

77

Programmation oriente objet

M.CHAKOUJ

Pour dcouvrir les membres de la classe List, voir le lien suivant :


http://msdn.microsoft.com/fr-fr/library/d9hw1as6%28v=vs.80%29

78

Programmation oriente objet

M.CHAKOUJ

TP 6
Exercice 1 :
1/ Crer la classe Elve.
Attributs : Numro, Nom, Prnom, Adresse, Section, Moyenne.
Mthodes :
Constructeur par dfaut.
Constructeur dinitialisation.
Affiche.
Accesseurs (Pour chaque attribut)
Modifieurs (Pour chaque attribut)
2/ Crer la classe Ecole qui contient :
Une liste dlves
Les mthodes :
Ajouter (ajouter un lve).
Modifier (modifier un lve donn par son numro).
Supprimer
Liste_Admis (qui affiche liste des lves admis).
Liste_Section (qui affiche liste des lves en donnant la section).
3/ Crer un programme qui le menu suivant : (dclarer un objet de type Ecole)

N.B : Utiliser lobjet List pour la cration de la liste


Exercice 2 :Ecrire le code correspondant ce diagramme de classes :

79

Programmation oriente objet

M.CHAKOUJ

80

Programmation oriente objet

M.CHAKOUJ

Exercice 3 :

81

Programmation oriente objet

M.CHAKOUJ

82

Programmation oriente objet

M.CHAKOUJ

Chapitre 9: Gestion des exceptions


I.
Exceptions :
Une exception est charge de signaler un comportement exceptionnel (mais prvu) dune
partie spcifique dun logiciel. Dans les langages de programmation actuels, les exceptions
font partie du langage lui-mme. Cest le cas de C# qui intgre les exceptions comme une
classe particulire: la classe Exception. Cette classe contient un nombre important de classes
drives.
II.
Grer une exception ?
Ds quune erreur se produit comme un manque de mmoire, un calcul impossible, un fichier
inexistant, un transtypage non valide,..., un objet de la classe adquate drive de la classe Exception est
instanci. Nous dirons que le logiciel " dclenche une exception ".
1. Programme sans gestion de l'exception
Soit un programme C# contenant un incident d'excution (une division par zro dans
l'instruction x = 1/0; ) dans la mthode meth() de la classe Action1, cette mthode est appele
dans la classe UseAction1 travers un objet de classe Action1 :

Lors de l'excution, aprs avoir affich les chanes "Dbut du programme" et " ...Avant
incident", le programme s'arrte et l'environnement d'excution commun (CLR ou Common
Language Runtime) signale une erreur. Voici ci-dessous l'affichage obtenu dans VS 2008:

83

Programmation oriente objet

M.CHAKOUJ

Sur la console l'affichage est le suivant :

Le programme s'est arrt cet endroit et ne peut plus poursuivre son excution.
Ds que l'instruction "x = 1/0;" a t excute celle-ci a provoqu un incident. En fait une
exception de la classe DivideByZeroException a t "leve" (un objet de cette classe a t
instanci) par le CLR, cette classe hrite de la classe ArithmeticException selon la hirarchie
d'hritage suivante de .Net Framework :
System.Object
|__System.Exception
|__System.SystemException
|__System.ArithmeticException
|__System.DivideByZeroException
Remarque : lhritage sera traiter dans le chapitre suivant.
La classe mre de toutes les exceptions de .Net Framework est la classe Exception.
Le CLR a arrt le programme immdiatement cet endroit parce qu'elle n'a pas trouv de
code d'interception de cette exception qu'il a leve automatiquement.
C# possde une instruction qui permet d'intercepter des exceptions drivant de la classe Exception : try ...
catch
2. Attraper une exception
Un gestionnaire d'exception attrape une classe d'exception particulire et gre le cas d'erreur correspondant.
Ce gestionnaire encadre les instructions grer pouvant lancer une exception.
La syntaxe est la suivante :
84

Programmation oriente objet

M.CHAKOUJ

try {// Une exception peut tre lance


instructions }
catch ( classe_d_exception variable ) {
// Grer l'erreur en fonction des dtails
// de l'erreur contenus dans la variable instructions
}
...autres blocs catch...
finally {
// Instructions toujours excutes
// Exception lance ou non instructions
}
Le bloc try est suivi d'un nombre quelconque de bloc catch (ventuellement aucun) attrapant diffrents types
d'exception, et ventuellement d'un bloc finally qui sera toujours excut quoi qu'il se passe.
3. Programme avec gestion de l'exception :
Soit le mme programme C# que prcdemment, contenant un incident d'excution (une division par zro
dans l'instruction x = 1/0; ). Cette fois nous allons grer l'incident grce un gestionnaire d'exception
try..catch dans le bloc englobant immdiatement suprieur.

85

Programmation oriente objet

M.CHAKOUJ

Ci-dessous l'affichage obtenu sur la console lors de l'excution de ce programme :

Nous remarquons que le CLR a donc bien excut le code d'interception situ dans le corps du "catch
(DivideByZeroException ){...}", il a poursuivi l'excution normale aprs le gestionnaire.
Le gestionnaire d'exception se situe dans la mthode Main (code englobant) qui appelle
la mthode meth( ) qui lve l'exception.
Il est aussi possible d'atteindre l'objet d'exception qui a t instanci (ou lev) en dclarant un identificateur
local au bloc catch du gestionnaire d'exception try catch, cet objet est disponible dans tout le corps de la
clause catch. Dans l'exemple qui suit, on dclare un objet Except de classe DivideByZeroException et l'on lit
le contenu de deux de ses proprits
Message et Source :
try{
Obj.meth();
}
catch ( DivideByZeroException Except ) {
// accs aux membres publiques de l'objet Except :
86

Programmation oriente objet

M.CHAKOUJ

Console.WriteLine("Interception exception message : " + Except.Message);


Console.WriteLine("Interception exception source : " + Except.Source);
.
}
Dans un gestionnaire try...catch, il est en fait possible d'intercepter plusieurs types d'exceptions
diffrentes et de les traiter.
Ci-aprs nous montrons la syntaxe d'un tel gestionnaire qui fonctionne comme un slecteur
ordonn, ce qui signifie qu'une seule clause d'interception est excute.
Ds qu'une exception intervient dans le < bloc de code protger>, le CLR scrute squentiellement toutes les
clauses catch de la premire jusqu' la nime. Si l'exception actuellement leve est d'un des types prsents
dans la liste des clauses le traitement associ est effectu, la scrutation est abandonne et le programme
poursuit son excution aprs le gestionnaire.
4. Libration des ressources avec finally :
Un bloc finally est utile pour librer des ressources la fin d'un traitement, qu'une erreur ait eu lieu ou non.
Par exemple si vous crivez une mthode qui ouvre un fichier.Si vous traitez laccs votre fichier dans le
bloc try,vous pouvez attraper des exceptions relatives louverture, lecture, criture dans le fichier .A la fin du
code vous aurez besoin fermer le fichier malgr que lexception est leve. Vous allez donc placer
linstruction de fermeture de fichier dans le boc finally.
III.

Lancer une exception


Il est possible de dclencher soi-mme des exceptions en utilisant l'instruction throw, voir mme de
dclencher des exceptions personnalises ou non. Une exception personnalise est une classe hritant de la
classe System.Exception dfinie par le dveloppeur lui-mme.
La syntaxe est la suivante :
throw objet_exception;
O objet_exception est une instance de la classe Exception ou de l'une de ses sous-classes.
En gnral, l'objet exception est allou en mme temps qu'il est lanc :
throw new classe_exception(arguments);
1. Lancer une exception prdfinies de C#.
Le CLR peut aussi lever (dclencher) une exception votre demande suite la rencontre d'une
instruction throw. Le programme qui suit lance une ArithmeticException (ie: instancie un objet de type
ArithmeticException) avec le message "Mauvais calcul !" dans la mthode meth( ) et intercepte cette
exception dans le bloc englobant Main. Le traitement de cette exception consiste afficher le contenu du
champ message de l'exception grce la proprit Message de l'exception :

87

Programmation oriente objet

M.CHAKOUJ

2. Dclenchement manuel d'une exception personnalise :


Pour une exception personnalise, le mode d'action est strictement identique, il vous faut
seulement auparavant crer une nouvelle classe hritant obligatoirement de la classe Exception ou de
n'importe laquelle de ses sous-classes.
Reprenons le programme prcdent et crons une classe d'exception que nous nommerons
ArithmeticExceptionPerso hritant de la classe des ArithmeticException puis excutons ce
programme :
// notre classe ArithmeticExceptionPerso
class ArithmeticExceptionPerso :ArithmeticException
{
public ArithmeticExceptionPerso(String s) : base(s)
{
}
}
//la classe qui contient la mthode lanant une exception ArithmeticExceptionPerso
//avec un message personnaliser
class Action1
{
public void meth()
88

Programmation oriente objet

M.CHAKOUJ

{
int x= 0;
Console.WriteLine(" ...Avant incident");
if (x == 0)
throw new ArithmeticExceptionPerso("Mauvais calcul !");
Console.WriteLine(" ...Aprs incident");
}
}
//La classe programme
class Program
{
static void Main(string[] args)
{
Action1 Obj = new Action1();
Console.WriteLine("Dbut du programme.");
try
{
Obj.meth();
}
catch (ArithmeticExceptionPerso E)
{
Console.WriteLine("Interception ArithmeticException : " +
E.Message);
}
Console.WriteLine("Fin du programme.");
Console.ReadLine();} }
Rsultat dexcution :

L'excution de ce programme est identique celle du programme prcdent, notre exception


personnalise fonctionne bien comme les exceptions prdfinies de C#.

89

Programmation oriente objet

M.CHAKOUJ

TP7
Exercice 1 :
Soit une classe Employ ayant comme attributs :
matricule,nom,prnom,age,echelle,genre (F ou H).
-Une exception AgeException sera dclanche si en essai daffecter lage une valeur non non comprise entre
18 et 100 ;
-Une exception nomme EchelleException sera levr si lechelle nest pas compri entre 5 et 30.
-Une execption GenreException sera leve si le gernre est diffrent de F et H.
-Une execption MatriculeException sera leve si on tente dajouter la liste des employs un employ ayant
un matricule dj affect.

Travail faire :
1-Ecrire le code de la classe Employ avec les proprits , et les constructeurs.
2- Ecrire les codes des classes dexceptions cites ci-dessus.
3- Dans la classe Program :
-Dclarer une collection demploys.
-crer 4 instances de la classe Employ,et ajouter ceux-ci la collection(les donnes seront demandes
lutilisateur ).
4- Grer ces exceptions.
Exercice 2 :
Lobjectif est de Construire une classe de nombres rationnels partir de la traduction en diagramme UML du
TAD de rationnel.
Une classe de rationnels implantera l'interface IRatio contenant la mthode Reduire ( ) l'objet rationnel :

La classe Rationnel :

90

Programmation oriente objet

M.CHAKOUJ

Les 2 proprits Denom et Num reprsente


respectivement le dnominateur et le numrateur du rationnel,
elles sont ranges dans les champs privs FDenom et FNum.
Reduire ( ) : rendre le rationnel irrductible en calculant le
pgcd du numrateur et du dnominateur, puis diviser ces deux
termes par le pgcd.
pgcd ( int a, int b ) : renvoie le pgcd de deux entiers non nuls.
ppcm ( int a, int b ) : renvoie le ppcm de deux entiers non
nuls.
Normalise ( ) : normalisation du signe du rationnel, soit
dnominateur toujours positif et seul le numrateur est sign.
operator +, -, /, * : oprations classiques sur les rationnels.
ToString ( ) : renvoie le rationnel sous forme d'une fraction
avec une barre "/" ( ex : 3/5 )

La classe Rationnel sera rendue robuste par l'utilisation d'une classe d'exception rationnelException :

Des exceptions seront lances dans les deux cas suivants :


La cration d'un rationnel dnominateur nul comme new Rationnel ( 5 , 0 ) dclenchera une
rationnelException avec comme message :

La mise la valeur 0 du dnominateur d'un rationnel r ( r.Denom = 0 ) dclenchera une rationnelException


avec comme message :

91

Programmation oriente objet

M.CHAKOUJ

Chapitre 10 : La Srialisation binaire


I.

Dfinitions :

La srialisation consiste rendre un objet susceptible dtre enregistr sur disque ou dtre transmis une
autre machine via une ligne de communication. La dsrialisation consiste crer et initialiser un objet
partir dinformations provenant dun fichier. La srialisation permet aussi de passer des objets dune machine
lautre.
II.

Srialisation et dsrialisation :
Pour srialiser un objet, il suffit de :
1. Marquer la classe de lobjet avec lattribut [Serializable].
2. Crer un objet BinaryFormatter ainsi quun objet FileStream pour crer un fichier.
3. Excuter Serialize.
Pour dsrialiser lobjet, cest--dire linstancier en mmoire partir dune lecture sur disque, il faut :
1. Crer un objet BinaryFormatter ainsi quun objet FileStream pour lire un fichier.
2. Excuter Deserialize appliqu lobjet BinaryFormatter.
Exemple :
Pour srialiser (dans le fichier objPers.dat du rpertoire courant mais peu importent le nom et
lextension) un objet de la classe Pers :
// srialiser dans le fichier objPers lobjet p de la classe //Pers
Pers p = new Pers("Gaston", 25);
BinaryFormatter formatter = new BinaryFormatter();
FileStream fs = new FileStream("objPers.txt", FileMode.OpenOrCreate,
FileAccess.Write);
formatter.Serialize(fs, p);
fs.Close();
Sur disque, on trouve maintenant un objet Pers contenu dans le fichier objPers.dat. Pour crer
lobjet en mmoire partir dune lecture dans ce fichier objPers.dat :
//Dsrialiser
BinaryFormatter formatter2 = new BinaryFormatter();
FileStream fsdes = new FileStream("objPers.dat",
FileMode.Open,FileAccess.Read);
Pers pdes = (Pers)formatter2.Deserialize(fsdes);
Console.WriteLine(pdes);
fsdes.Close();
On retrouve dans p.Nom et p.Age les informations enregistres lors de la srialisation de lobjet
(ici srialisation dans le fichier objPers.dat).
Rien ne nous empche de srialiser une collection dobjets (il pourrait sagir dune liste gnriques:
ArrayList al = new ArrayList();
Pers p = new Pers("Gaston", 25); al.Add(p);
p = new Pers("Jeanne", 23); al.Add(p);
// srialiser la collection (ici un tableau dynamique
dobjets Pers)
BinaryFormatter formatter = new BinaryFormatter();
FileStream fs = new FileStream("objListe.dat", FileMode.OpenOrCreate,
FileAccess.Write);
formatter.Serialize(fs, al);
fs.Close();
Pour dsrialiser la collection ainsi enregistre sur disque dans le fichier objListe.dat :
BinaryFormatter formatter = new BinaryFormatter();
92

Programmation oriente objet

M.CHAKOUJ

FileStream fs = new FileStream("objListe.dat", FileMode.Open,


FileAccess.Read);
ArrayList al = (ArrayList)formatter.Deserialize(fs);
fs.Close();
Attention :
La srialisation consiste convertir tout (ou une partie) des valeurs des attributs dune classe. Le code des
mthodes ou des proprits nest pas srialis.
Un srialiseur srialise par dfaut des types primitifs. Si la classe srialiser contient des champs faisant
rfrence dautres types complexes (non primitifs :des classes) il faudra alors dfinir ces autres types comme
srialisable.
Exercice :
1-Utiliser la srialisation pour coder la mthode Exporter() vue dans le projet Gestion dinventaire.
2- Utiliser la dsrialisation pour coder la mthode Editer() qui permet dafficher le contenu du fichier associ
une administration.
Solution de lexercice :Srialisation et dsrialisation
public void exporter() {
//le fichier concernat l'administration courante sera crer dans le
bureau
string s ="C:\\Users\\chakouj\\Desktop\\"+this.nom+".txt";
BinaryFormatter formatter = new BinaryFormatter();
FileStream fs = new FileStream(s,
FileMode.OpenOrCreate,FileAccess.Write);
formatter.Serialize(fs, ls);
fs.Close();
}
public void Editer() {
string s ="C:\\Users\\chakouj\\Desktop\\"+this.nom+".txt";
BinaryFormatter formatter = new BinaryFormatter();
FileStream fs = new FileStream(s, FileMode.Open, FileAccess.Read);
List<Site> al = (List<Site>)formatter.Deserialize(fs);
Console.WriteLine("le ficher "+ s+" contient : ");
foreach (Site site in al)
{
Console.WriteLine(site.ToString());
Console.WriteLine("Les quipements ");
foreach(Equipement eq in site.le)
Console.WriteLine(eq.ToString());
Console.WriteLine("------------------- ");

}
fs.Close();

93

Programmation oriente objet

M.CHAKOUJ

Chapitre 11 : Type nullable,type var,type dynamic,Regex,using

I.

Les types nullable :

1-Intorduction :
C# version 2 a introduit les types nullables (nullable types en anglais) pour rpondre la question suivante :
comment signaler quun contenu de variable ne correspond rien ?
Ce concept est bien connu et est largement utilis depuis de nombreuses annes dans le domaine des bases de
donnes (contrainte signalant quun champ de table peut avoir une valeur nulle).
Dans le cas dobjets, cest simple : on lui donne la valeur nulle (mot rserv null dans la rfrence).
Mais pour les types valeurs (int, float, etc. ainsi que les structures), la rponse est plus complique.
2.Syntaxe :
On peut crer une telle variable (ici un int nullable) en crivant :
Nullable<int> i1=1;
Nullable<int> i2=null; // ou bien : int? i2 = new Nullable<int>();
Nullable<int> i3;
i1 est de type Nullable<int>, avec HasValue qui vaut true et Value qui vaut 1.
i2 est de type Nullable<int>, avec HasValue qui vaut false.
i3, comme toute variable, ne pourra tre utilise quaprs initialisation une valeur entire ou null(sinon le
compilateur dtecte lutilisation dune variable non assigne). Dclarer i3 sans linitialiser na pas pour effet
dinitialiser sa proprit HasValue false ! La proprit HasValue de i3 ne pourra donc tre lue quaprs
initialisation de i3.
Cette syntaxe tant assez lourde, on peut crire de manire tout fait quivalente :
int? i1=1;
int? i2=null;
int? i3;
Quelles oprations peut-on effectuer sur ces variables ? Considrons les variables suivantes :
int i=1, j=2;
int? ni=10, nj=null;

94

Programmation oriente objet

M.CHAKOUJ

II.
Le type var :
C# version 3 (VS 2008) a introduit le type var. Avec var, nous laissons au compilateur le soin de dterminer le
vritable type dun objet. Le vritable type de la variable est dtermin ds la compilation, daprs la valeur
dinitialisation. Le type de la variable ne peut tre modifi par la suite. Le compilateur ne fait donc que
substituer un vritable type var.
Au lieu dcrire (en supposant que la classe Pers existe et que ..... remplacent des initialisations de
proprits) :
Pers p = new Pers { ..... };
int q = 15;
string s = "Hello";
on peut crire :
var p = new Pers { ..... };
var q = 15;
var s = "Hello";
Le compilateur dtermine automatiquement que les types de p, q et s sont respectivement Pers, int etstring en
fonction des valeurs dinitialisation (en dclarant une variable de type var, il faut donner une valeur
95

Programmation oriente objet

M.CHAKOUJ

dinitialisation). p, q et s garderont ce type tant que ces variables restent en vie. Ces types ne pourront jamais
tre modifis suite une assignation dun autre type dans p, q et s (il en rsulterait une erreur de compilation).
var nest applicable quaux objets dclars localement dans une fonction (on ne peut donc pas trouver var dans
une dfinition de classe).
III.
Le type dynamic :
C# version 4 (Visual Studio 2010) a pour cela introduit le type dynamic, qui signifie : pas de type
dfinitivement associ une variable de type dynamic .
Le vritable type, un moment donn, dune variable (car une variable doit avoir un type, un
moment donn) est dtermin en cours dexcution par du code videmment supplmentaire inject par le
compilateur dans le programme (et non plus lors de la compilation de celui-ci) et peut varier tout moment,
en fonction des assignations effectues dans cette variable. Par exemple (en supposant que Pers soit une classe
dj dclare et sans reprendre ses valeurs dinitialisation) :
dynamic x; // type de x inconnu ce stade
x = 10; // x maintenant de type entier
x = "Bonjour"; // x maintenant de type string
x = new Pers { ..... }; // x maintenant de type Pers
La variable x passe, en cours dexcution, par les types int, string et Pers, en fonction des oprations
effectues sur x.
XV.

Les expressions rgulires : System.Text.RegularExpressions

1. Utilisation :
Les Regex sont un outil (ou plutt un systme) trs puissant permettant de vrifier la syntaxe d'une chane de
caractres. Plus prcisment, c'est vrifier que la chane de caractres examiner respecte un motif ou une
srie de motifs (notre Regex) dsignant la syntaxe attendue de la phrase.
Les Regex sont utilises pour trois grands types d'action :
- Vrifier la syntaxe(forme) d'une chane de caractres (ex : adresse ip de forme chiffre.chiffre.chiffre.chiffre)
- Remplacer une partie de la chane (token) par un lment spcifique
- Dcouper une chane de caractres

2. Syntaxe
Les Regex sont donc une suite de motifs qui se composent de mtacaractres, de classes sous .NET et d'alias.
Voici tout d'abord, une srie de mtacaractres pouvant tre utiliss et ayant chacun une correspondance bien
prcise.

96

Programmation oriente objet

M.CHAKOUJ

Ces mtacaractres nous permettent donc de faire des combinaisons infinies pouvant correspondre tous les besoins.
Nanmoins, pour vrifier des chanes de caractres de taille importante, l'criture de ces mtacaractres peut tre
fastidieuse, en plus du fait que la chaine Regex n'est pas trs lisible pour le developpeur. Heureusement, il existe une
srie d'alias permettant de faciliter cette tche :

3. Exemples
Comme rien n'est plus parlant qu'un exemple concret, en voici quelque-uns qui dmontrent quel point les
chanes Regex peuvent tre simples...
ou complexes :)
Chane qui contient des lettres de a d : [a-d] ou [abcd]
Chane qui contient des lettres de a d ou n'importe quelles lettres majuscules : [a-dA-Z]
Chane commenant (et finissant) par y ou z : ^(y | z)$
Chane ne contenant pas de chiffre : [^0-9]
Chane contenant les chiffres 1 ou 2 ou le symbole ^ : [12\^]
On peut utiliser plusieurs mtacaractres :
^[pP]hara(onix)?$ : phara, Phara, pharaonix ou Pharaonix
Ou tout simplement vrifier la validit d'une adresse ip :
^(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}$
Note: Cette ligne de validation semble complexe mais dans une application, elle est la seule alternative une
suite norme de substring() et comparaisons via les mthodes traditionnelles.

4. Utilisation en .Net
Les Regex ncessitent l'utilisation de l'espace de noms System.Text.RegularExpressions.

a. Validation d'une chane


La validation d'une chane de caractres se fait grce la mthode IsMatch() qui retourne une valeur
boolenne gale true si la chane correspond la Regex et false dans le cas contraire.
Voici comme exemple, la mthode ValidMail() vrifie la validit d'une adresse mail passe en paramtre.

private bool ValidMail(string adresse)


97

Programmation oriente objet

M.CHAKOUJ

{
System.Text.RegularExpressions.Regex myRegex = new Regex(@"^([\w]+)@([\w]+)\.([\w]+)$");
//([\w]+) ==> caractre alphanumrique apparaissant une fois ou plus
return myRegex.IsMatch(adresse); // retourne true ou false selon la vrification
}

b. Remplacement dans une chane


Une deuxime utilit des Regex est de pouvoir rechercher des occurrences de chanes spcifiques et de les
remplacer par une autre chane. Dans ce cas prcis, nous utiliserons la mthode Replace(). Celle-ci est plus ou
moins identique la mthode Replace() de l'objet string, mais cette dernire ne permet de remplacer qu'une
seule chane de caractres par une autre. Prenons comme exemple, la mthode, SMS qui s'assure de remplacer
certains termes par d'autres:
Slectionnez
private string SMS(string chaine)
{
System.Text.RegularExpressions.Regex myRegex = new Regex("(lut|salut|yop)");
return myRegex.Replace(chaine,"bonjour"); //renvoi la chaine modifie
}
Cette fois ci, notre mthode remplacera toutes les occurrences des mots " lut ", " salut " et " yop " par le mot
"bonjour".
c. Dcoupage dune chaine par sparateur
Grce aux Regex, il est galement possible de dcouper une chane de caractres de diffrentes manires.
La premire mthode est la mthode Split() qui gnre un tableau de chanes de caractres en dcoupant une
chane de dpart via un sparateur : mais ici, nous pouvons dclarer des sparateurs dynamiques.
Voici comme exemple, la mthode Splitter() qui dcoupe une chane caractres en plusieurs chanes dont les
sparateurs sont des chiffres

Slectionnez
private string[] Splitter(string chaine)
{
Regex myRegex=new Regex(@"\d+");
return myRegex.Split(chaine);
}
En lui passant la chane "Voici3234un2exemple23423427de2chane3424de767caractres"; elle renverra un
tableau contenant {Voici, un, exemple, de, chane, de, caractres}

XVI.

Le port dun objet et la clause using :

Le ramasse-miettes (ou garbage collector) est un processus intgr dans le .NET Framework permettant de
librer automatiquement la mmoire lorsquun objet nest plus
98

Programmation oriente objet

M.CHAKOUJ

utilis.
Il est cependant trs difficile de prvoir quel moment le ramasse-miettes se mettra fonctionner. Certaines
classes contiennent des ressources, telle une connexion une base
de donnes quil faut librer ds que lobjet nest plus utilis.
Si le ramasse-miettes met du temps se dclencher, la connexion la base de donnes risque dtre libre
tardivement. Le bloc using de C# permet de protg un objet implmentant linterface IDisposable. Lors de la
sortie de ce bloc, la mthode Dispose()(de libration) de lobjet protg est automatiquement appele.
using (EcritureFichier f = new EcritureFichier())
{
f.EcritureFichier();
}
Lobjet f peut tre utilis seulement lintrieur des accolades.

99

Programmation oriente objet

M.CHAKOUJ

Ressources bibliographiques :
1. Laboratoire auto-formation Rm di Scala
2. C# et .NET Versions 1 4 G r a r d L e b l a n c
3. Polycopie programmation orient objet Mr.A Ben Daoud.
4. Le site http://msdn.microsoft.com/fr-fr/library est le site de rfrence pour accder la documentation
officielle de C# et du .NET Framework.
Le site http://social.msdn.microsoft.com/forums/fr-fr/categories est un ensemble de forums consacrs aux
dveloppements des technologies Microsoft.
5.
http://www.developpez.com
6.
C# 4 Dveloppez des applications Windows avec Visual Studio 2010 Jrme HUGON

100

Programmation oriente objet

M.CHAKOUJ

Annexe :Liste mots cls en C#

Si vous avez besoin dutiliser un mot cl en tant quidentifiant pour un membre, il faut prfixer le nom de
lidentifiant par le caractre @.
101

Programmation oriente objet

M.CHAKOUJ