5 Programmation Orientee Objet
5 Programmation Orientee Objet
5 Programmation Orientee Objet
Michael Blondin
Direction de lenseignement de service en informatique Universit de Montral
Hiver 2011
1 / 78
Classes
Une classe est une structure qui permet de regrouper des donnes et des oprations dune mme nature. Par exemple, une classe Personne pourrait regrouper les informations personelles dune personne comme son nom, son ge, son salaire, etc.
2 / 78
Classes
Donnes membres ( variables ) Proprits ( mthodes spciales ) Constructeurs ( mthodes spciales ) Mthodes
3 / 78
Classes
De faon gnrale, chaque chier .cs contient exactement une classe. De plus, chaque chier porte le nom de la classe quil contient (mais cela nest pas obligatoire comme dans certains langages).
4 / 78
Classes
Voici la syntaxe pour dnir une classe : Syntaxe
class NomDeLaClasse { // Donnees et operations ici }
Il est ensuite possible de dclarer une variable dont le type est une classe : Syntaxe
NomDeLaClasse foo;
5 / 78
Classes
Un concept important en programmation oriente objet est lencapsulation. Cette ide consiste cacher et protger linformation contenue dans un objet et dorif des mthodes pour manipuler les donnes.
Un objet est donc vu comme une bote noire dont lon connat les fonctionnalits, mais pas les dtails dimplmentation.
6 / 78
Classes
Une faon dencapsuler les donnes est dutiliser des accesseurs et des mutateurs. Un accesseur est une sous-routine qui permet daccder ltat dun objet sans donner un accs direct aux donnes. Un mutateur est la variante qui permet dassigner une valeur. Ce concept peut tre ralis laide de proprits ou de mthodes, il faut dabord aborder le sujet des donnes membres avant de bien comprendre.
7 / 78
Une donne membre est une variable propre une classe permettant de stocker ltat dun objet.
Gnralement, elles sont utilises par les proprits et les mthodes, mais ne sont pas directement accessibles lextrieur de la classe.
8 / 78
Pour dnir une donne membre, il sut dutiliser la syntaxe de dnition de variables. Syntaxe
class NomDeLaClasse { ... int _nomDeLaDonneeMembre; ... }
Gnralement, les conventions de nommage prvoient une notation dirente pour les donnes membres (ex : _var, var_, m_var.)
9 / 78
10 / 78
Il est dconseill de rendre une donne membre publique. Cela va contre le principe fondamentale de lencapsulation en programmation oriente objet.
Il est donc prfrable dutiliser de proprits (ou des mthodes) pour modier ltat dun objet.
11 / 78
Classes : proprits
Une proprit est une mthode spciale se comportant comme une donne membre. Les proprits permettent dimplmenter le concept daccesseurs et de mutateurs. Elles permettent donc de lire et modier ltat dun objet.
12 / 78
Classes : proprits
Il ne faut pas utiliser les paranthses lors de lappel dune proprit, par opposition aux appels de mthodes. De plus, les proprits permettent laectation avec linstruction =.
Plusieurs proprits ont dj t rencontr telles que Text (champs de saisie) et Checked (cases cocher).
13 / 78
Classes : proprits
Voici la syntaxe dune proprit Syntaxe
class NomDeLaClasse { ... type MaPropriete { get { ... } set { ... } } ... }
La portion get dcrit la valeur de retour de la proprit tandis que la portion set dcrit laectation.
14 / 78
Classes : proprits
Voici un exemple simple de proprit : Exemple
class MaClasse { int _age; public int Age { get { return _age; } set { _age = value; } } }
Notons que le mot-clef value permet dobtenir la valeur assigner dans le bloc set.
15 / 78
Classes : proprits
Exemple
MaClasse foo = new MaClasse(); // Instancier un objet, // a voir plus tard foo.Age = 24; int age = foo.Age; // age vaut 24
16 / 78
Classes : proprits
Voici un exemple simple de proprit plus complexe : Exemple
class MaClasse { const double SECONDES_PAR_HEURE = 3600; double _secondes; public double Heures { get { return _secondes / SECONDES_PAR_HEURE; } set { _seconds = value * SECONDES_PAR_HEURE; } } }
17 / 78
Classes : proprits
Notons que limplmentation de notre classe utilise des secondes, mais que lutilisateur na pas sen proccuper.
18 / 78
Classes : proprits
Il est possible domettre lun des blocs set ou get. Dans ces cas respectifs, lon dit que la proprit est en lecture seule ou criture seule. Il devient donc impossible de lire ou crire selon le bloc omis.
19 / 78
Classes : proprits
20 / 78
Classes : proprits
Il est possible de spcier si une proprit peut tre accessible ou non en dehors dune classe laide des mots-clefs private et public. Syntaxe
class NomDeLaClasse { ... private int MaProprietePrivee { ... }; public int MaProprietePublique { ... }; ... }
21 / 78
Classes : proprits
Le niveau daccessibilit peut tre ran. Par exemple, une proprit peut tre publique en lecture mais prive en criture. Syntaxe
class NomDeLaClasse { ... public MaPropriete { [private] set { ... } [private] get { ... } } ... }
Par dfaut, les blocs set et get ont la mme accessibilit que la proprit.
22 / 78
Classes : proprits
Dans lexemple suivant, la proprit Fonctionnel peut tre lue lextrieur de lobjet mais il nest possible de la modier qu lintrieur de lobjet : Exemple
class MaClasse { bool _estFonctionnel; public bool Fonctionnel { get { return _estFonctionnel; } private set { value = _estFonctionnel; } } }
23 / 78
Classes : proprits
Lorsquune proprit implmente un accesseur et mutateur de base, il est possible dutiliser une proprit automatique. Syntaxe
class NomDeLaClasse { type MaProprieteAutomatique { get; set; } }
Notez quil ny a aucune donne membre dclarer, cela est fait implicitement.
24 / 78
Classes : proprits
25 / 78
Classes : constructeurs
Lorsque que lon veut utiliser une variable et que son type est une classe, il est ncessaire de la dclarer puis de linstancier. La dclaration se fait de la mme faon que pour une variable de type atomique :
Syntaxe
MaClasse maVariable;
26 / 78
Classes : constructeurs
Une variable ne peut pas tre utilise tant quelle na pas t instancie. Linstanciation se fait de cette faon : Syntaxe
maVariable = new MaClasse();
Bien sr, la syntaxe permet linstanciation sur la mme ligne que la dclaration : Syntaxe
MaClasse maVariable = new MaClasse();
27 / 78
Classes : constructeurs
Un constructeur est une mthode spciale qui permet dindiquer ce quil se produit lorsquun objet est instanci. Typiquement, un constructeur initialise les donnes membres de lobjet.
Un constructeur ne possdant aucun paramtre est nomm un constructeur par dfaut. Si aucun constructeur nest spci, un constructeur par dfaut est fourni par le compilateur.
28 / 78
Classes : constructeurs
La syntaxe dun constructeur est similaire celle dune mthode. Cependant, un constructeur ne possde pas de type de retour et son nom est obligatoirement celui de la classe.
Notez que bien quun constructeur ne possde pas de type de retour, il demeure possible de lever des exceptions.
29 / 78
Classes : constructeurs
Voici la syntaxe du constructeur par dfaut : Syntaxe
class MaClasse { ... public MaClasse() { // Code ici } ... }
Notez quen gnral, il faut toujours prcder un constructeur par le mot-clef public.
30 / 78
Classes : constructeurs
Exemple
class Personne { public int Age { get; set; } public string Nom { get; set; } public Personne() { Age = 0; Nom = "Sans nom"; } } Personne individu; // individu nest pas instancie, // impossible de lutiliser individu = new Personne(); // individu est instancie // avec le constructeur par defaut
31 / 78
Classes : constructeurs
Une classe peut possder plusieurs constructeurs. Un constructeur possdant des paramtres est nomm constructeur paramtrique. Syntaxe
class MaClasse { ... public MaClasse(type1 parametre1, type2 parametre2, ...) { // Code ici } ... }
32 / 78
Classes : constructeurs
Exemple
class Personne { public int Age { get; set; } public string Nom { get; set; } public Personne(int age, string nom) { Age = age; Nom = nom; } } Personne individu = new Personne(50, "Paul");
33 / 78
Classes : constructeurs
Si une classe possde un ou plusieurs constructeurs paramtriques, le constructeur par dfaut nexiste plus automatiquement. Si un constructeur par dfaut est ncessaire, il faut donc le dnir explicitement.
34 / 78
Classes : constructeurs
Un constructeur peut appeler un autre constructeur laide du mot-clef this. Cela est souvent pratique pour viter dcrire du code redondant. Syntaxe
class MaClasse { ... public MaClasse(...) : this(/* parametres ici */ ) { // Code ici } ... }
35 / 78
Classes : constructeurs
Exemple
class Personne { public int Age { set; get; } public string Nom { set; get; } public Personne(int age, string nom) { Age = age; Nom = nom; } public Personne() : this(0, "Aucun nom") { } } Personne individu = new Personne(); // individu.Age = 0 // individu.Nom = "Aucun nom"
36 / 78
Classes : mthodes
Les mthodes forment une pice essentielle des classes. Elles permettent de modier et manipuler un objet. Voici un rappel de la syntaxe : Syntaxe
type_sortie NomDeLaMethode(type1 parametre1, type2 parametre2, ...) { // Code ici }
Une mthode naccdant pas une donne membre na normalement aucun intrt et ne devrait pas se trouver lintrieur de la classe.
37 / 78
Classes : mthodes
Voici un exemple de classe possdant quelques mthodes : Exemple
class Prix { const double SEUIL_CHER = 100; const double TAUX_DEFAUT = 0.13925; // TPS + TVQ public double Montant { get; set; } public bool EstCher() { return Montant >= SEUIL_CHER; } public double CalculerTaxe(double taux) { return Montant * taux; } public double CalculerTaxe() { return CalculerTaxe(TAUX_DEFAUT); } public void DoublerMontant() { Montant *= 2; } }
38 / 78
Classes : mthodes
Voici un exemple de classe possdant quelques mthodes : Exemple
Prix prix = new Prix(); prix.Montant = 50; double foo = prix.CalculerTaxe(0.1); double bar = prix.CalculerTaxe(); prix.DoublerMontant(); bool cher = prix.EstCher();
39 / 78
Classes : mthodes
Voici un exemple de classe possdant quelques mthodes : Exemple
Prix prix = new Prix(); prix.Montant = 50; double foo = prix.CalculerTaxe(0.1); double bar = prix.CalculerTaxe(); prix.DoublerMontant(); bool cher = prix.EstCher();
Aprs lexcution de ce code, les variables foo, bar et cher possdent respectivement les valeurs 5, 6.9625 et true.
40 / 78
Classes : mthodes
Il est possible de spcier si une mthode peut tre accessible ou non en dehors dune classe laide des mots-clefs private et public. Syntaxe
class NomDeLaClasse { ... [private/public] type NomDeLaMethode(...); ... }
41 / 78
Classes : hritage
Lhritage est un concept important en programmation oriente objet qui permet la spcialiser des classes pour amliorer le dcoupage et faciliter la rutilisation du code.
42 / 78
Classes : hritage
Par exemple, supposons que nous avons une classe Personne contenant les informations et fonctionnalits relies un individu.
Un tudiant est une personne, mais il possde des informations que certains nont pas, comme un domaine dtude ou une universit dattache.
43 / 78
Classes : hritage
Il serait fcheux davoir rimplmenter tout le support fourni par la classe Personne pour notre classe Etudiant. Lhritage permet de palier proprement ce problme.
Dans la dnition de notre classe Etudiant, il est possible dindiquer quelle hrite de Personne. Ainsi, si une personne possdait un ge par exemple, un tudiant en possde aussi un.
44 / 78
Classes : hritage
Si nous dsirons quune classe B hrite dune classe A, la syntaxe est la suivante : Syntaxe
class B : A { ... }
45 / 78
Classes : hritage
Dans ce cas, Personne est le parent de Etudiant et Etudiant est un enfant de Personne.
46 / 78
Classes : hritage
47 / 78
Classes : hritage
La classe Etudiant possde donc quatre proprits et le code suivant est valide : Exemple
Etudiant etudiant = new Etudiant(); etudiant.Age = 24; etudiant.Nom = "Marc"; etudiant.DomnaineEtude = "Informatique"; etudiant.NomUniversite = "Universite de Montreal";
48 / 78
Classes : hritage
Une classe enfant nhrite pas ncessairement de tous les lments de son parent. Les lments privs (private). Exemple
class A { public int Foo { get; set; } private int Bar { get; set; } } class B : A { void Test() { Foo = 10; // OK Bar = 10; // Ne compile pas } }
49 / 78
Classes : hritage
Il existe un troisime niveau daccessibilit qui prend son sens dans le contexte de lhritage. Le mot-clef qui lui est associ est protected.
Celui-ci se comporte comme private mais permet aux classes enfants dhriter des lments.
50 / 78
Classes : hritage
Exemple
class A { public int Foo { get; set; } protected int Bar { get; set; } } class B : A { void Test() { Foo = 10; // OK Bar = 10; // OK } }
Notez que Bar est accessible dans B (et ses potentiels enfants) mais est inaccessible par les autres classes.
51 / 78
Classes : hritage
Lorsquun objet est instanci et que celui-ci possde un parent, le code du constructeur du parent est dabord excut. Exemple
class A { public A() { /* Code ici */ } } class B : A { public B() { /* Code ici */ } } B foo = new B(); // Appel de A(), puis B()
52 / 78
Classes : hritage
Il est possible de choisir le constructeur du parent qui doit tre appel laide du mot-clef base (de faon similaire this). Exemple
class A { public A(int i) { /* Code ici */ } } class B : A { public B() : base(10) { /* Code ici */ } }
53 / 78
Classes : hritage
Supposons que nous avons dni les classes suivantes : Exemple
class Personne { public int Age { set; get; } public string Nom { set; get; } public Personne(int age, string nom) { Age = age; Nom = nom; } public Personne() : this(0, "Aucun nom") { } }
54 / 78
Classes : hritage
Exemple
class Etudiant : Personne { public string DomaineEtude { get; set; } public string NomUniversite { get; set; } public Etudiant(int age, string nom, string domaineEtude, string nomUniversite) : base (age, nom) { DomaineEtude = domaineEtude; NomUniversite = nomUniversite; } public Etudiant() { DomaineEtude = "Aucun"; NomUniversite = "Aucune"; } }
55 / 78
Classes : hritage
56 / 78
Librairie .NET
Il est important de connatre ce quelles orent puisque cela vite dcrire du code dj existant.
57 / 78
Une partie importante du code consiste stocker des donnes. Il y a plusieurs structures de donnes disponibles dans la librairie .NET permettant daccomplir cette tche de faon aise.
58 / 78
La structure List permet de stocker plusieurs lments dun certain type dans une liste. Une importante dirence avec les tableaux est que la taille des listes peut changer. Pour instancier une liste, il sut dutiliser le code suivant : Exemple
List<type> liste = new List<type>();
59 / 78
Il existe deux mthodes pour insrer des lments : Add : reoit un lment et lajoute la n de la liste. AddRange : reoit une collection dlments et les ajoute la n de la liste.
Syntaxe
liste.Add(element); liste.AddRange(collection);
60 / 78
Pour accder un lment, il sut dutiliser loprateur [ ] comme dans le cas des tableaux.
Syntaxe
liste[index]
61 / 78
62 / 78
63 / 78
Il est possible de vrier si une liste contient un lment laide de la mthode Contains. Sa valeur de retour est une valeur boolenne valant true si et seulement si la liste contient llment.
Syntaxe
liste.Contains(element);
65 / 78
Syntaxe
liste.Count();
66 / 78
Syntaxe
liste.Sort();
67 / 78
68 / 78
69 / 78
La structure Dictionary permet de stocker plusieurs lments associs une clef. Pour instancier un dictionnaire, il sut dutiliser le code suivant : Exemple
Dictionary<type_clef, type_elements> dict; dict = Dictionary<type_clef, type_elements>();
70 / 78
Pour insrer un lment, il sut dutiliser la mthode Add. Celle-ci reoit une clef et un lment et insre la paire au dictionnaire.
Syntaxe
liste.Add(clef, element);
71 / 78
Notez que le code suivant insre (clef, element) si la clef nexistait pas : Syntaxe
liste[clef] = element;
72 / 78
Il existe deux mthodes pour supprimer un lment : Remove : reoit une clef et supprime llment associ cette clef. Clear : supprime tous les lments de la liste.
Syntaxe
liste.Remove(clef); liste.Clear();
73 / 78
74 / 78
75 / 78
Comme dans le cas des listes, la mthode Count permet dobtenir le nombre dlments. Les mthodes ContainsKey et ContainsValue permettent respectivement de vrier si une clef ou un lment sont contenus dans la structure. Syntaxe
liste.Count(); liste.ContainsKey(clef); liste.ContainsValue(element);
76 / 78
titre dexemple, voici quelques fonctionnalits de la librairie Math : Abs : renvoie la valeur absolue dun nombre. Max : renvoie la valeur maximale entre deux nombres. Min : renvoie la valeur maximale entre deux nombres. Round : renvoie la valeur arrondie dun nombre (possibilit de spcier la prcision). Cos, Sin, Tan, Log, Sqrt : respectivement les fonctions mathmatiques Cosinu, Sinus, Tangente, Logarithme, Racine carre.
77 / 78
Il existe plusieurs autres librairies permettant, entre autres, de grer les lments suivants :
Il est donc fortement encourag pour un programmeur C# de se familiariser avec la librairie .NET.
78 / 78