Vous êtes sur la page 1sur 78

IFT1148 Programmation oriente objet en C#

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.

Une classe permet donc de crer de nouveaux types plus complexes.

2 / 78

Classes

Une classe peut contenir plusieurs lments tels que :

Donnes membres ( variables ) Proprits ( mthodes spciales ) Constructeurs ( mthodes spciales ) Mthodes

Les lments prcdents seront expliqus.

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

Classes : donnes membres

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

Classes : donnes membres

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

Classes : donnes membres


Il est possible de spcier si une donne membre peut tre accessible ou non en dehors dune classe laide des mots-clefs private et public. Syntaxe
class NomDeLaClasse { ... private int _nomDeLaDonneeMembrePrivee; public int _nomDeLaDonneeMembrePublique; ... }

Par dfaut, les donnes membres sont prives.

10 / 78

Classes : donnes membres

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

Voici un exemple de manipulations de la proprit Age :

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

Voici un exemple de manipulations de la proprit Heures : Exemple


MaClasse foo = new MaClasse(); // Instancier un objet, // a voir plus tard foo.Heures = 10; int heures = foo.Heures; // heures vaut 10

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

Voici un exemple de proprit en lecture seule : Exemple


class MaClasse { string _nom; string _prenom; string Nom { get { return _prenom + " " + _nom; } } }

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 { ... }; ... }

Par dfaut, les proprits sont prives.

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

Voici un exemple dutilisation de proprit automatique : Exemple


class MaClasse { int Age { get; set; } } MaClasse foo = new MaClasse(); // Instancier un objet, // a voir plus tard foo.Age = 24; int age = foo.Age; // age vaut 24;

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(...); ... }

Par dfaut, les mthodes sont prives.

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 { ... }

On dit que A est le parent de B et que B est un enfant de A.

45 / 78

Classes : hritage

Dans lexemple prsent prcdemment, nous aurions : Exemple


class Etudiant : Personne { ... }

Dans ce cas, Personne est le parent de Etudiant et Etudiant est un enfant de Personne.

46 / 78

Classes : hritage

Supposons que nous avons dni les classes suivantes : Exemple


class Personne { public int Age { get; set; } public string Nom { get; set; } } class Etudiant : Personne { public string DomaineEtude { get; set; } public string NomUniversite { get; set; } }

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

Considrez le code suivant : Exemple


Etudiant foo = new Etudiant(); Etudiant bar = new Etudiant(21, "Julie", "Biologie", "Universite de Montreal");

Que se passe-t-il linstanciation ?

56 / 78

Librairie .NET

La plateforme .NET contient un ensemble de librairies facilitant grandement le dveloppement.

Il est important de connatre ce quelles orent puisque cela vite dcrire du code dj existant.

57 / 78

Librairie .NET : structures de donnes

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.

Considrons les structures de donnes List et Dictionary.

58 / 78

Librairie .NET : structures de donnes

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>();

Initialement la liste ne contient aucun lment.

59 / 78

Librairie .NET : structures de donnes

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

Librairie .NET : structures de donnes

Pour accder un lment, il sut dutiliser loprateur [ ] comme dans le cas des tableaux.

Syntaxe
liste[index]

61 / 78

Librairie .NET : structures de donnes


Il existe trois mthodes pour supprimer un lment : Remove : reoit une valeur et supprime le premier lment de la liste possdant cette valeur. RemoveAt : reoit un index et supprime llment contenu cet index. Clear : supprime tous les lments de la liste. Syntaxe
liste.Remove(valeur); liste.RemoveAt(index); liste.Clear();

62 / 78

Librairie .NET : structures de donnes


Quels lments contient bar la n de lexcution de ce code ? Exemple
List<int> foo = new List<int>(); List<int> bar = new List<int>(); foo.Add(2); foo.Add(5); foo.Add(3); bar.AddRange(foo); bar.Add(5); bar.Add(0); bar.RemoveAt(0); bar.Remove(5);

63 / 78

Librairie .NET : structures de donnes


Quels lments contient bar la n de lexcution de ce code ? Exemple
List<int> foo = new List<int>(); List<int> bar = new List<int>(); foo.Add(2); foo.Add(5); foo.Add(3); bar.AddRange(foo); bar.Add(5); bar.Add(0); bar.RemoveAt(0); bar.Remove(5);

La liste bar contient {3, 5, 0}.


64 / 78

Librairie .NET : structures de donnes

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

Librairie .NET : structures de donnes

La mthode Count permet dobtenir la quantit dlments dans la liste.

Syntaxe
liste.Count();

66 / 78

Librairie .NET : structures de donnes

La mthode Sort permet de trier les lments de la liste en ordre ascendant.

Syntaxe
liste.Sort();

67 / 78

Librairie .NET : structures de donnes

Quels lments contient liste la n de lexcution de ce code ? Exemple


int[] tableau = {1, 2, 3, 4, 5}; List<int> liste = new List<int>(); liste.AddRange(tableau); for (int i = 0; i < liste.Count(); i++) if (EstPair(liste[i])) liste[i] /= 2;

68 / 78

Librairie .NET : structures de donnes

Quels lments contient liste la n de lexcution de ce code ? Exemple


int[] tableau = {1, 2, 3, 4, 5}; List<int> liste = new List<int>(); liste.AddRange(tableau); for (int i = 0; i < liste.Count(); i++) if (EstPair(liste[i])) liste[i] /= 2;

La liste contient {1, 1, 3, 2, 5}.

69 / 78

Librairie .NET : structures de donnes

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>();

Initialement le dictionnaire ne contient aucun lment.

70 / 78

Librairie .NET : structures de donnes

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

Librairie .NET : structures de donnes


Pour accder un lment, il sut dutiliser loprateur [ ] avec la clef de llment. Syntaxe
liste[clef]

Notez que le code suivant insre (clef, element) si la clef nexistait pas : Syntaxe
liste[clef] = element;

72 / 78

Librairie .NET : structures de donnes

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

Librairie .NET : structures de donnes

Quels lments contient etudiants la n de lexcution de ce code ? Exemple


Dictionary<int, string> etudiants = new Dictionary<int, string>(); etudiants.Add(1001, "Paul"); etudiants.Add(9050, "Julie"); etudiants.Add(1002, "Jean"); etudiants.Remove(1002)

74 / 78

Librairie .NET : structures de donnes

Quels lments contient etudiants la n de lexcution de ce code ? Exemple


Dictionary<int, string> etudiants = new Dictionary<int, string>(); etudiants.Add(1001, "Paul"); etudiants.Add(9050, "Julie"); etudiants.Add(1002, "Jean"); etudiants.Remove(1002)

Le dictionnaire etudiants contient {(1001, Paul), (9050, Julie)}.

75 / 78

Librairie .NET : structures de donnes

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

Librairie .NET : mathmatiques

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

Librairie .NET : autres

Il existe plusieurs autres librairies permettant, entre autres, de grer les lments suivants :

Fichiers Fils dexcution Flux

Il est donc fortement encourag pour un programmeur C# de se familiariser avec la librairie .NET.

78 / 78

Vous aimerez peut-être aussi