Upload
lekien
View
217
Download
0
Embed Size (px)
Citation preview
1
PProgrammation OOrientée OObjet (POO)
UNIVERSITE de METZ
Olivier HABERTMaître de Conférences
Laboratoire d'Automatique des
Systèmes Coopératifs (LASC)
2
PProgrammation OOrientée OObjet (POO)
Qu'est ce qu’un Programme OOrientée OObjet ?– Ensemble d'objets autonomes et responsables qui
s'entraident pour résoudre un problème final en s'envoyant des messages.
Objet 1
Objet 2
Objet 3
Message
3
PProgrammation OOrientée OObjet
Qu’est ce qu’un objet– Objet = Données + Méthodes (Fonctions Membres)
DONNEES
Fonction 1 Fonction 2
Fonction3
Fonction 4Fonction 5
Fonction 6
4
PProgrammation OOrientée OObjet
Exemple d’un objet
R P
SetValueR SetValueP
GetValueR
GetValueP
Résistance
GetRmax
GetRmin
5
PProgrammation OOrientée OObjet
Encapsulation des données– L’accès aux données des objets est réglementé
• Données privées accès uniquement par les fonctions membres• Données publiques accès direct par l’instance de l’objet
– Conséquences• Un objet n’est vu que par ses spécifications• Une modification interne est sans effet pour le fonctionnement
général du programme• Meilleure réutilisation de l’objet
– Exemple de la résistance• Les données R et P ne peuvent être utilisées que par les fonctions
membres
6
PProgrammation OOrientée OObjet
Polymorphisme (du Grecque plusieurs formes)– Un nom (de fonction, d’opérateur) peut être associé à plusieurs
mais différentes utilisations– Exemple
• Si a est un nombre complexe, sqrt(a) appellera si elle existe la fonction adaptée au type de a.
• Dans un langage non OO, il aurait fallu connaître le nom de deuxfonctions distinctes (selon que a soit complexe ou réel)
• C’est le système qui choisit selon le type de l’argument ou de l’opérande
7
PProgrammation OOrientée OObjet
L’Héritage– Permet de définir les bases d’un nouvel objet à partir
d’un objet existant– Le nouvel objet hérite des propriétés de l’ancêtre et
peut recevoir de nouvelles fonctionnalitésAvantages– Meilleures réutilisations des réalisations antérieures
parfaitement au point
8
PProgrammation OOrientée OObjet
Concept de Classe– Type réunissant une description
• D’une collection de données membres hétérogènes ayant un lien entres elles
• D’une collection de méthodes (fonctions membres) servant à manipuler les données membres
– Généralisation du type structurestructure ou recordrecord des langages non OOOO (classe = définition de données + définition de méthodes)
– Possibilité de fixer la visibilité externe des différents constituants de la classe
9
PProgrammation OOrientée OObjet
Instance d’une classe– C’est un objet initialisé à partir de la description figée
d’une classeFonctions membres publiques– Les constructeurs– Les destructeurs– Les accesseurs– Les modificateurs
10
PProgrammation OOrientée OObjet
Les Constructeurs– Permettent d’initialiser l’objets lors de sa création
• copie des arguments vers les données membres• initialisation de variables dynamiques à la création de l’objet
– Sont appelés de manière automatique à la création de l’objet– Peuvent être surchargés On peut en définir plusieurs de
même nom mais acceptant des arguments différents– Possèdent le même nom que la classe
11
PProgrammation OOrientée OObjet
Le Destructeur– Il est unique– Est appelé automatiquement lors de la destruction de
l’objet– Sert généralement à éliminer les variables dynamiques
de l’objet (créées en général par le constructeur)– Il a pour nom le nom de la classe précédé du symbole
~
12
PProgrammation OOrientée OObjet
Les Accesseurs– Catégorie de fonctions membres qui permettent l’accès
et l’utilisation des informations privées contenues dans l’objet
Les Modificateurs– Permettent de modifier l’état des données internes
(publiques ou privées) de l’objet
13
PProgrammation OOrientée OObjet
Définition d’une Classe en C++
class nom_classe{
private:Déclaration des données privées et des fonctions membres Déclaration des données privées et des fonctions membres
privéesprivéespublic:
Déclaration des données publiques et des fonctions Déclaration des données publiques et des fonctions membres publiquesmembres publiques
};
14
PProgrammation OOrientée OObjet
Exempleclass BouteilleBiere{
private:char NomBiere[30];char couleur[30];float contenance;float TitreAlcool;int NBBPES;
public:BouteilleBiere(char *, char *, float,float,int);BouteilleBiere(char *,float);float GetContenance();int GetNBBPES();
};
15
PProgrammation OOrientée OObjet
Ecriture des fonctions membres en C++Type de l’argument nom de la classe :: nom de la fonction (arguments)
Exemplefloat BouteilleBiere::GetContenance(){
return contenance;}
BouteilleBiere::BouteilleBiere(char *name, char *color, float c,float t,int n){
strcpy(NomBierre,name);strcpy(couleur,color);contenance = c;TitreAlcool = t;NBBPES = n;
}
16
PProgrammation OOrientée OObjet
Création d’un objet statique en C++– nom de la classe nom de l’objet(arguments);– Exemple:
BouteilleBiere MaBouteille("1664","blonde",33.0,6.5,20);
Création d’un objet dynamique en C++– pointeur vers classe = new nom de la classe(argument)– Exemple:
BouteilleBiere* Mabouteille;Mabouteille = new BouteilleBiere("Kro","brune",25.0,5.5,30);delete Mabouteille;
17
PProgrammation OOrientée OObjet
Accès aux fonctions membres d’un objet en C++– Si l’objet est représenté par une variable
• Nom_Variable.Nom fonction;• Exemple:
– Mabouteille.GetContenance();
– Si l’objet est représenté par un pointeur• Nom_pointeur Nom fonction;• Exemple:
– pMabouteille GetContenance();
18
PProgrammation OOrientée OObjet
Programme completBouteilleBiere::BouteilleBiere(char *name, char *color, float c,float t,int n){
strcpy(NomBierre,name);strcpy(couleur,color);contenance = c;TitreAlcool = t;NBBPES = n;
}
BouteilleBiere::BouteilleBiere(char *name,float c){
strcpy(NomBierre,name);strcpy(couleur,"BLONDE");contenance = 33.0;TitreAlcool = c;NBBPES = 20;
}
main(){
BouteilleBiere* Mabouteille;Mabouteille = new BouteilleBiere("Kro","brune",25.0,5.5,30);cout << Mabouteille GetContenance();delete Mabouteille;
}
#include <iostream.h>#include <string.h>class BouteilleBiere{
private:char NomBiere[30];char couleur[30];float contenance;float TitreAlcool;int NBBPES;
public:BouteilleBiere(char *, char *, float,float,int);BouteilleBiere(char *,float);float GetContenance();int GetNBBPES();
};float BouteilleBiere::GetContenance(){
return contenance;}
int BouteilleBiere::GetNBBPES(){
return NBBPES;} 25
19
PProgrammation OOrientée OObjetProgramme complet avec destructeur
BouteilleBiere::BouteilleBiere(char *name, char *color, float c,float t,int n){
strcpy(NomBierre,name);strcpy(couleur,color);contenance = c;TitreAlcool = t;NBBPES = n;
}
BouteilleBiere::BouteilleBiere(char *name,float c){
strcpy(NomBierre,name); strcpy(couleur,"BLONDE");contenance = 33.0; TitreAlcool = c;NBBPES = 20;
}
BouteilleBiere::~BouteilleBiere(){
cout <<"c'est fini !!"<<'\n';}
main(){
BouteilleBiere* Mabouteille;Mabouteille = new BouteilleBiere("Kro","brune",25.0,5.5,30);cout << Mabouteille GetContenance();delete Mabouteille;
}
#include <iostream.h>#include <string.h>class BouteilleBiere{
private:char NomBiere[30];char couleur[30];float contenance;float TitreAlcool;int NBBPES;
public:BouteilleBiere(char *, char *, float,float,int);BouteilleBiere(char *,float);float GetContenance();int GetNBBPES();~BouteilleBiere();
};float BouteilleBiere::GetContenance(){
return contenance;}
int BouteilleBiere::GetNBBPES(){
return NBBPES;}
25 c'est fini !!
20
PProgrammation OOrientée OObjet
Héritage en C++– Spécifications Classe Dérivée = Spécifications Classe
Ancêtre + Nouvelles Spécifications– Héritage des données et des fonctions membres sauf:
• Les constructeurs et destructeurs de l'ancêtre– Introduction d'un nouveau statut: protectedprotected
• membre ne pouvant être utilisé que par les fonctions membres de la classe et de celles qui en seront dérivées
21
PProgrammation OOrientée OObjet
Syntaxe d'héritageclass nom_nouvelle_classe : type héritage nom_ancêtre {…};class nom_nouvelle_classe : type héritage nom_ancêtre {…};
Exemple– On désire créer une classe BouteilleVin à partir de
BouteilleBiere
class class BouteilleVin BouteilleVin : public : public BouteilleBouteilleBierre Bierre {…}{…}
22
PProgrammation OOrientée OObjet
Type d'héritage– Règles de dérivation de classe
inaccessibleinaccessibleprotectedprotected
publicpublic
privateprivateprotectedprotected
publicpublicpublicpublic
inaccessibleinaccessibleprotectedprotectedprotectedprotected
privateprivateprotectedprotected
publicpublicprotectedprotected
inaccessibleinaccessibleprivateprivateprivateprivate
privateprivateprotectedprotected
publicpublicprivateprivate
statut du membre dans la classe dérivée
statut du membre dans la classe ancêtremode de dérivation
23
PProgrammation OOrientée OObjet
Conséquences des différents type de dérivation– Dérivation privée: ( mode par défaut)
• Les membres deviennent privateprivate ou inaccessible• Tous les membres seront inaccessibles à la seconde dérivation
– Dérivation publique:• Les membres gardent le même statut sauf les membres privateprivate qui
deviennent inaccessibles– Dérivation protégée:
• Tous les membres non privés deviennent de type protectedprotected, les membres privés deviennent inaccessibles
24
PProgrammation OOrientée OObjet
Ajout de données et de fonctions membresclass class BouteilleVinBouteilleVin : public : public BouteilleBierreBouteilleBierre{{
public:public:BouteilleVinBouteilleVin(char *n, char *(char *n, char *coulcoul, , floatfloat c, c, floatfloat t, t, intint n, n, intint a) :a) :
BouteilleBiereBouteilleBiere(char *n, char *(char *n, char *coulcoul, , float float c, c, floatfloat t, t, intint n);n);
BouteilleVinBouteilleVin(char * nom, (char * nom, floatfloat t) : t) : BouteilleBiereBouteilleBiere(char * nom, (char * nom, floatfloat t) ;t) ;int GetAnneeint GetAnnee();();
privateprivate::int anneeint annee;;
};};
25
PProgrammation OOrientée OObjet
Constructeurs et Destructeur dans les opérations d'héritages– Quand à la fois la classe de base et la classe dérivée ont des
constructeurs et des destructeurs:• Constructeurs sont exécutés dans l'ordre de la dérivation
• Destructeurs dans l'ordre inverse de la dérivation– C'est au constructeur de l'objet dérivé en dernier de passer les
arguments dont a besoin son ancêtre. (voir exemple précédent)
26
PProgrammation OOrientée OObjet
Quelques exemples d'héritages#include <iostream.h>
class base {
int x;
public:
void setx(int n) {x=n;}
void showx() {cout <<x<<'\n';}
};
class derive : public base {
int y;
public:
void sety(int n) {y=n;}
void showy() {cout << y << '\n';}
void show_somme() {cout << x+y <<'\n';}
};
main()
{
derive ob;
ob.setx(10);
ob.sety(20);
ob.showx();
ob.showy();
return(0);
}
Cherchez l'erreur ?
27
PProgrammation OOrientée OObjet
Quelques exemples d'héritages#include <iostream.h>
class base {
int x;
public:
void setx(int n) {x=n;}
void showx() {cout <<x<<'\n';}
};
class derive : private base {
int y;
public:
void sety(int n) {y=n;}
void showy() {cout << y << '\n';}
};
main()
{
derive ob;
ob.setx(10);
ob.sety(20);
ob.showx();
ob.showy();
return(0);
}
Cherchez l'erreur ?
28
PProgrammation OOrientée OObjet
Quelques exemples d'héritages#include <iostream.h>
class base {
int x;
public:
void setx(int n) {x=n;}
void showx() {cout <<x<<'\n';}
};
class derive : private base {
int y;
public:
void setxy(int n,int m) {setx(n) ; y=m;}
void showxy() {showx(); cout << y << '\n';}
};
main()
{
derive ob;
ob.setxy(10,20);
ob.showxy();
return(0);
}
Pourquoi ça marche maintenant ?
29
PProgrammation OOrientée OObjet
Quelques exemples d'héritages#include <iostream.h>
class base {
public:
base(){ cout <<"construction de la classe de base \n;}
~base(){ cout <<"destruction de la classe de base \n;}
};
class derive : public base{
public:
derive() { cout << "construction de la classe dérivée \n";}
~derive(){cout << "destruction de la classe dérivée \n";}
};
main()
{
derive o;
return(0);
}
Affichage Ecranconstruction de la classe de base construction de la classe dérivée destruction de la classe dérivée destruction de la classe de base
30
PProgrammation OOrientée OObjetQuelques exemples d'héritages
#include <iostream.h>
class base {
public:
base(){ cout <<"construction de la classe de base \n;}
~base(){ cout <<"destruction de la classe de base \n;}
};
class derive : public base{
int j;
public:
derive(int n) { j = n; cout << "construction de la classe dérivée \n";}
~derive(){cout << "destruction de la classe dérivée \n";}
showj(){ cout <<j <<'\n';}
};
main(){
derive o(10);o.showj();return(0);
}
Affichage Ecranconstruction de la classe de base construction de la classe dérivée10destruction de la classe dérivée destruction de la classe de base
31
PProgrammation OOrientée OObjetQuelques exemples d'héritages
#include <iostream.h>
class base {
int i;
public:
base(int n){ i=n; cout <<"construction de la classe de base \n;}
~base(){ cout <<"destruction de la classe de base \n;}
void showi(){cout <<i<<'\n';}
};
class derive : public base{
int j;
public:
derive(int n) :base(n){
j = n; cout << "construction de la classe dérivée \n";}
~derive(){cout << "destruction de la classe dérivée \n";}
showj(){ cout <<j <<'\n';}
};
main(){
derive o(10);o.showi();o.showj();return(0);
}
Affichage Ecranconstruction de la classe de base construction de la classe dérivée1010destruction de la classe dérivée destruction de la classe de base
32
PProgrammation OOrientée OObjetQuelques exemples d'héritages
#include <iostream.h>class base {int i;public:
base(int n){ i=n; cout <<"construction de la classe de base \n;}~base(){ cout <<"destruction de la classe de base \n;}void showi(){cout <<i<<'\n';}
};class derive : public base{int j;public:
derive(int n,int m) :base(m){j = n; cout << "construction de la classe dérivée \n";}
~derive(){cout << "destruction de la classe dérivée \n";}showj(){ cout <<j <<'\n';}
};
main(){
derive o(10,20);o.showi();o.showj();return(0);
}
Affichage Ecranconstruction de la classe de base construction de la classe dérivée2010destruction de la classe dérivée destruction de la classe de base
33
PProgrammation OOrientée OObjet
Surcharge des Fonctions– On peut définir des fonctions de même nom mais se
différentiant par le nombre et le type d'arguments– Exemple:
• float Val_Absolue(float v) {return fabs(v);}• int Val_Absolue(int v){return abs(v);}• Le système choisira la fonction à appeler selon les
arguments.
34
PProgrammation OOrientée OObjet
Surcharge des opérateurs en C++– Même principe que la surcharge des fonctions
• Le fonctionnement de l'opérateur s'effectue en fonction du nombre et du type des opérandes
• La surcharge d'un opérateur doit obligatoirement s'associer à une classe
35
Surcharge des opérateurs en C++– Exemple:
#include <iostream.h>class point {public:
int x,y;point(){x=0;y=0;}point(int i,int j) {x=i;y=j;}point operator+(point p2);
};point point::operator+(point p2){
point temp;temp.x = x + p2.x;temp.y = y + p2.y;return temp;
}
main(){
point p1(10,10),p2(5,3),p3;p3 = p1 + p2;cout << p3.x <<< p3.y <<'\n';
}
PProgrammation OOrientée OObjet
36
PProgrammation OOrientée OObjet
Passage de paramètres par référence en C++– Idem dans les spécifications au passage par pointeurs mais
évite leurs lourdeurs d'écriture– Exemple:
• Passage par pointeur:void permutter ( int *a, int *b) {int temp = *a; *a =*b;*b =temp;}main(){ int a=8;int b=7; permutter(&a,&b);}
• Passage par référence:void permutter (int &a, int &b) {int temp = a;a = b; b = temp;}main() {int a=8;int b=7;permutter(a,b);}
37
PProgrammation GGraphique sous WWindows
Programmation avec les API (Application Programming Interface)– Que sont les API
• Ensemble d'interfaces pour accéder à la fonctionnalité des services de bas niveau (gestion des périphériques, du système, du réseau,…)
• Implantées sous forme de librairie (DLL)
38
//useful defines#define STRICT#define WIN32_LEAN_AND_MEAN#include <windows.h>#include "resource.h"
//entry point for a windows programint WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int);//main window callback functionLRESULT CALLBACK WindowFunc(HWND, UINT, WPARAM, LPARAM);
// GLOBAL VARIABLESconst char* pClassName="TTWin32Generic";HINSTANCE hMainInst=0; //instance of the applicationHWND hMainWnd=0; //handle to main window of the application//various variables used with virtual windowHDC memdc=0;HBITMAP hbit=0;HBRUSH hbrush=0;HPEN hpen, hOldPen;RECT rClient;int MaxX=0, MaxY=0;
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpszArgs,int nWinMode)
{//create a window class by filling in a WNDCLASSEX structureWNDCLASSEX WinClass;WinClass.cbSize=sizeof(WNDCLASSEX); //size of the structureWinClass.hInstance=hInstance; //instance of the applicationhMainInst=hInstance;WinClass.lpszClassName=pClassName; //window class nameWinClass.lpfnWndProc=WindowFunc; //callback function WinClass.style=CS_HREDRAW | CS_VREDRAW;//load default application icon//WinClass.hIcon=LoadIcon(NULL, IDI_APPLICATION);//load standard (32 x 32) iconWinClass.hIcon=LoadIcon(hInstance,
MAKEINTRESOURCE(IDI_BIG));//load small (16 x 16) icon//if specified then it is used on the taskbar and in the system menu//otherwise 32 x 32 icon is scaled to 16 x 16 by Windows//WinClass.hIconSm=LoadIcon(hInstance,
MAKEINTRESOURCE(IDI_SMALL));WinClass.hIconSm=0;//load cursorWinClass.hCursor=LoadCursor(NULL, IDC_ARROW);//here we can specify a menu handleWinClass.lpszMenuName=MAKEINTRESOURCE(IDR_MENU);WinClass.cbClsExtra=0;WinClass.cbWndExtra=0;
WinClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);//register window class we just createdif(!RegisterClassEx(&WinClass))return 0; //registration failed
HWND hwnd=CreateWindow(pClassName,"Generic Windows 95
application", WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,HWND_DESKTOP,NULL,hInstance,NULL);
if(!hwnd) //window creation failedreturn 0;
hMainWnd=hwnd;//show windowShowWindow(hwnd, nWinMode);//force a repaintUpdateWindow(hwnd);MSG WinMsg;
//start message pumpwhile(GetMessage(&WinMsg, NULL, 0, 0)){TranslateMessage(&WinMsg);DispatchMessage(&WinMsg);
}return WinMsg.wParam;
}
Création de la classe de la fenêtre
Création de la FenêtrePrototype de Fonctions
et Variables Globales
39
LRESULT CALLBACK WindowFunc(HWND hwnd, UINT Msg,
WPARAM wParam, LPARAM lParam){//device context for drawingHDC hdc=0;switch(Msg){case WM_CREATE:{//get height and width of the screenMaxX=GetSystemMetrics(SM_CXSCREEN);MaxY=GetSystemMetrics(SM_CYSCREEN);//get device contexthdc=GetDC(hwnd);//create compatible device context to memorymemdc=CreateCompatibleDC(hdc);hbit=CreateCompatibleBitmap(hdc, MaxX, MaxY);SelectObject(memdc, hbit);hpen=CreatePen(PS_SOLID, 1, RGB(0, 0, 0));hOldPen=(HPEN)SelectObject(memdc, hpen);//if we did not set window background//while registering window class then//we need following two lines
hbrush=(HBRUSH)GetStockObject(WHITE_BRUSH);SelectObject(memdc, hbrush);PatBlt(memdc, 0, 0, MaxX, MaxY, PATCOPY);ReleaseDC(hwnd, hdc);break;
}
//this message is sent when a window needs to//be repaintedcase WM_PAINT:{PAINTSTRUCT paintstruct;//get device context for drawinghdc=BeginPaint(hwnd, &paintstruct);//paint the windowBitBlt(hdc, 0, 0, MaxX, MaxY, memdc, 0, 0, SRCCOPY);EndPaint(hwnd, &paintstruct);break;
}case WM_LBUTTONDOWN:{//if we press left mouse button...//some drawing code...RECT rClient;GetClientRect(hwnd, &rClient);for(int nCnt=0; nCnt < rClient.right; nCnt+=5){MoveToEx(memdc, nCnt, 0, (POINT*)NULL);LineTo(memdc, rClient.right-nCnt, rClient.bottom);
}//invalidate window to force a WM_PAINT messageInvalidateRect(hwnd, (const RECT*)NULL, TRUE);break;
}
//if menu item selectedcase WM_COMMAND:{WORD wID=LOWORD(wParam); //id of the
menu itemswitch(wID){case IDM_FOPEN://File->Open is disabled for nowbreak;
case IDM_EXIT:DestroyWindow(hwnd);break;
}break;
}case WM_DESTROY:
//release used resourcesSelectObject(memdc, hOldPen);DeleteObject(hpen);DeleteObject(hbit);DeleteDC(memdc);PostQuitMessage(0);break;
default: //all other messages are handled by default
return DefWindowProc(hwnd, Msg, wParam, lParam);}return 0;
}
Définition de la Procédure de Fenêtre(Réponse aux différents messages)
40
PProgrammation GGraphique sous WWindows
Exécution du programme
41
PProgrammation GGraphique sous WWindows
Programmation avec une bibliothèque d'objets– Exemple:
• ObjectWindows de Borland ou Microsoft Fundation Classes (MFC)
• Collection d'objets graphiques que l'on peut dériver et améliorer
42
PProgrammation GGraphique sous WWindows
Exemple de Programme avec ObjectWindows#include <owl/pch.h>#include <owl/applicat.h>#include <owl/framewin.h>
class TDrawApp : public TApplication {public:
TDrawApp() : TApplication() {}
void InitMainWindow(){
SetMainWindow(new TFrameWindow(0, "Ma premiere Fenetre avec ObjectWindows"));}
};int OwlMain(int /*argc*/, char* /*argv*/ []){
TDrawApp MaFenetre;MaFenetre().Run();return 1;
}
43
PProgrammation GGraphique sous WWindows
Exécution du Programme
44
PProgrammation GGraphique sous WWindows
Programmation Visuelle– Avec Visual Basic, Delphi, C++ Builder
– Interface de haut qui permet de construire graphiquement l'architecture graphique d'une application
– Couche logicielle qui gère graphiquement la manipulation des objets
45
PProgrammation GGraphique sous WWindows
Création d'une Application avec C++ Builder
46
PProgrammation GGraphique sous WWindows
Création d'une Application avec Visual Basic