POO Programmation Oriente Objet Prsentation n David Ansart
POO : Programmation Orientée Objet
Présentation n David Ansart Département Informatique – Bureau 004 E Email : ansart@cril. univ-artois. fr
Intérêt de la POO n Le code est plus sûr n Les programmes sont plus clairs n La maintenance des applications est facilitée n Le code est facilement réutilisable n n Il est facile de créer de nouveaux algorithmes légèrement différents par clonage d’un algorithme existant Il est facile de faire évoluer des programmes
Langages Objets n n C++ Java Smalltalk Eiffel
les caractéristiques de l’Objet La 1ère étape consiste à déterminer n les entités que l'on souhaite manipuler n la description générique qui relie toutes ses entités.
Exemple n Prenons ces informations : n n n 14 Juillet 1789 (Prise de la Bastille) 11 Novembre 1918 (Armistice) 07 Mars 2005 Ce sont des dates. Chaque date se caractérise par : n n n un jour un mois une année.
Les Date Prise de la Bastille • Jour • 14 • Mois • Juillet • Année • 1789 Une Date Armistice • 7 • 11 • Mars • Novembre • 2005 • 1918
Classes n n Le Jour, le Mois et l’Année sont les attributs d’une Date. Cet ensemble d’attributs est appelé une Classe.
Objets n n Le 14 Juillet 1789 et le 11 Novembre 1918 sont chacune des instances de la classe Date. Chacune de ces dates est appelée un Objet.
Autre Exemple : Les planètes n n Saturne : planète gazeuse. Son diamètre est de 120. 536 km. Elle est à une distance moyenne de 1. 426. 725. 400 km du Soleil. Mars : planète rocheuse. Son diamètre est de 6794 km. Elle est à une distance moyenne de 227. 936. 640 km du Soleil. Jupiter : planète gazeuse. Son diamètre est de 142. 984 km. Elle est à une distance moyenne de 779 millions de km du Soleil. Terre : planète rocheuse. Son diamètre est de 12. 756, 28 km. Elle est à une distance moyenne de 150. 000 km du Soleil.
Planète (suite) Ces planètes ont en commun : n Le Type : Rocheuse, Gazeuse n La Distance au Soleil : 227936640, 779 millions, 1426725400, 150000000 n Le Diamètre : 12756. 28, 120536, 142984, 6794
La classe Planete • Type Terre • Rocheuse Saturne • Gazeuse • Distance. Au. Soleil • 150000000 • 1426725400 • Diametre • 12756, 28 • 120536 Jupiter • Gazeuse Mars • Rocheuse • 779 millions • 227936640 • 142984 • 6794
Encore un Exemple n n n Pierre, 19 ans, étudiant en SRC. groupe 1, sous-groupe 2. Nathalie, étudiante en informatique, a 18 ans. Elle est dans le sous-groupe 1 du Groupe 2. Paul, un garçon de 21 ans, est en GEA. Il est dans le groupe 3, sous-groupe 2.
Etudiant Ici, un étudiant se caractérise par n age n département n groupe n sous-groupe n sexe
Etudiant – 1ère possibilité Etudiant • Age • Departement • Groupe • Sous. Groupe • Sexe Pierre Nathalie • 19 • 18 • SRC • INFO • 1 • 2 Paul • 1 • Garçon • 21 • Fille • GEA • 3 • 2 • Garçon
Etudiant – 2ème possibilité Etudiant • Prénom • Age • Departement • Groupe • Sous. Groupe • Sexe Etudiant 1 Etudiant 3 • Pierre • Nathalie • 19 • 18 • SRC • INFO • 1 • 2 • Garçon Etudiant 2 • Paul • 21 • GEA • 3 • 2 • Garçon • 2 • 1 • Fille
Définir une classe en C++ class CDate { int Jour; int Mois; int Annee; }; class Nom. Classe { type. Attribut 1 nom. Attribut 1; type. Attribut 2 nom. Attribut 2; type. Attribut 3 nom. Attribut 3; type. Attribut 4 nom. Attribut 4; … };
Objet en C++ Comment créer un objet prise. Bastille de type CDate ? La classe CDate est un type comme un autre (int, char…) { CDate prise. Bastille; }
Initialiser un Objet Pour l’instant, notre objet prise. Bastille n’est pas encore le 14 Juillet 1789. Spécifier chaque attribut à la main { prise. Bastille. Jour = 14; prise. Bastille. Mois = 07; prise. Bastille. Annee = 1789; }
Initialiser un Objet Autre exemple : la date armistice que l'on souhaite initialiser au 11 Novembre 1918 { CDate armistice; armistice. Jour=11; armistice. Mois=11; armistice. Annee=1918; }
Intérêt de la POO Spécifier des comportements génériques communs à tous les objets de notre classe. Par exemple : n s'initialiser n s'afficher n vérifier si c'est contemporain
Initialiser class CDate { int Jour ; int Mois ; int Annee ; void Init. Date(int jour, int mois, int annee) { Jour = jour; Mois = mois; Annee = annee; } };
Afficher class CDate { int Jour ; int Mois ; int Annee ; void Init. Date(int jour, int mois, int annee) {…} void Affiche() { cout << Jour << "/" << Mois << "/" <<Annee ; } };
Contemporain class CDate { int Jour; int Mois; int Annee; void Init. Date(int jour, int mois, int annee) {…} void Affiche() {…} bool Contemporain() { if( Annee >= 2000 ) return true; return false; } };
Exemple { CDate prise. Bastille; prise. Bastille. Init. Date(14, 07, 1789); CDate armistice; armistice. Init. Date(11, 1918); cout <<"La date "; prise. Bastille. Affiche(); cout <<" est elle contemporaine ? " << prise. Bastille. Contemporaine()<<endl; } cout <<"La date "; armistice. Affiche(); cout <<" est elle contemporaine ? " << armistice. Contemporaine()<<endl;
Résultat { CDate prise. Bastille; CDate armistice; prise. Bastille. Init. Date(14, 07, 1789); cout <<"La date "; prise. Bastille. Affiche(); cout <<" est elle contemporaine ? " << prise. Bastille. Contemporaine()<<endl; armistice. Init. Date(11, 1918); cout <<"La date "; armistice. Affiche(); cout <<" est elle contemporaine ? " << armistice. Contemporaine()<<endl; } La date 14/07/1789 est elle contemporaine ? no La date 11/11/1918 est elle contemporaine ? no
Initialiser un Objet – 2ème Il existe une autre méthode pour initialiser les attributs d'un objet : utiliser les constructeurs. Un constructeur est une "procédure" appelée automatiquement qui permet de spécifier chacun des attributs de l’objet en fonction de ses paramètres. Un constructeur ne possède aucun type de retour, même pas void.
Constructeur par défaut class CDate { int Jour ; int Mois ; int Annee ; CDate() {/* constructeur par défaut qui initialise l'objet date au 01 Janvier 2005 */ Jour = 1; Mois = 1; Annee = 2005; } };
Créer mon objet { CDate une. Date; cout << "La date "; une. Date. Affiche(); cout<< " est elle contemporaine ? " << une. Date. Contemporaine(); }
Créer mon objet (suite) { CDate une. Date; Le programme va appeler automatiquement le constructeur (aucun paramètre). L'objet une. Date sera donc initialisé avec le 01 Janvier 2005 cout << "La date "; une. Date. Affiche(); cout << " est elle contemporaine ? " << une. Date. Contemporaine(); } il appelle ensuite la fonction Affiche() pour afficher la date puis la fonction Contemporaine() pour savoir si elle est contemporaine de notre siècle. On obtient : La date 01/01/2005 est elle contemporaine ? yes
Autres Constructeurs Possibles CDate (int jour, int mois, int annee) { Jour = jour; Mois = mois; Annee = annee; } CDate (int jour, int mois) { Jour = jour; Mois = mois; Annee = 2005; }
Usage { CDate une. Date; CDate prise. Bastille (14, 07, 1789); CDate date. Cette. Annee(7, 03); une. Date. Affiche(); // 01/01/2005 prise. Bastille. Affiche(); // 14/07/1789 date. Cette. Annee. Affiche(); // 7/3/2005 }
Écriture d'un Constructeur class Ma. Class { type 1 Attribut 1; … Ma. Class(type. P 1 parametre 1, type. P 2 parametre 2, …) { … } };
Sécurité Comment empêcher un programmeur de définir la date 38/14/-362 ? { CDate date. Impossible; date. Impossible. Jour=38; date. Impossible. Mois=14; date. Impossible. Annee=-362; date. Impossible. Affiche(); }
mots clés Le C++ met à votre disposition 3 mots clés : n public: n private: n protected:
public: n Tous les attributs ou fonctions situés sous le mot clé public: sont accessibles en dehors de l’objet ou depuis n'importe quelles fonctions de la classe. Remarque : Les fonctions précédentes ne fonctionnent qu'en ajoutant le mot clé public:
Exemple de public: class CDate { public: int Jour; int Mois; int Annee; void Affiche() { cout << Jour << "/" << Mois << "/" << Annee; } }; { CDate une. Date; une. Date. Jour=06; une. Date. Mois=10; une. Date. Annee=1289; une. Date. Affiche(); // 06/10/1289 }
private: n n Tous les attributs ou fonctions situés sous le mot clé private: ne sont accessibles que depuis les fonctions de l’objet. C'est le comportement par défaut si aucun mot clé n'est spécifié.
private: class Ma. Classe { public: int Nbre. Accessible; private: int Nbre. Protege; void Affiche() { cout<<Nbre. Protege<<end; } public: void Lance. Affiche() { Affiche(); } }; { Ma. Classe objet; objet. Nbre. Accessible=3; // OK objet. Nbre. Protege=7; // Impossible objet. Affiche(); // Impossible objet. Lance. Affiche(); // OK }
protected: n n Utile en ce qui concerne l'héritage. Nous verrons cela plus tard. Pour l'instant, protected: est équivalent à private:
Sécurité Problème : Comment empêcher l'accès à certains attributs tout en donnant la possibilité de les modifier/consulter ? Solution : Définir des accesseurs
Accesseur en lecture Un accesseur en lecture est une fonction de la classe permettant de récupérer le contenu d'un de ses attributs. int Get. Mois() { return Mois; }
Accesseur en écriture Un accesseur en écriture est une procédure de la classe permettant de modifier le contenu d'un de ses attributs. void Set. Mois(int mois) { Mois = mois; }
Protéger les attributs de la classe CDate class CDate { private: int Jour; int Mois; int Année; public: int Get. Mois() { return Mois; } void Set. Mois(int mois) { if( mois < 1 || mois >= 12 ) mois=1; Mois=mois; } int Get. Jour(){ … } void Set. Jour(int jour ) { … } int Get. Annee() { … } void Set. Annee(int annee){ … } };
Reprenons notre exemple Essayons de définir la date 38/14/-362 ? { CDate date. Impossible; date. Impossible. Set. Jour(38); // Jour = 1 date. Impossible. Set. Mois(14); // Mois = 1 date. Impossible. Set. Annee(-362); // Annee = 2005 date. Impossible. Affiche(); // 1/1/2005 }
- Slides: 45