Upload
cerise-francois
View
109
Download
4
Embed Size (px)
Citation preview
OBJET
Les concepts
Approche classique Basée sur la séparation entre:
Le code Les données
Un programme est un ensemble de procédures qui utilisent et modifient des données
Programmer c’est concevoir des traitements
Approche classique
Découpage net entre données et traitement
SQL
SGBD
Prog 3
Prog 2
Prog 1
SP
Approche Objet Regrouper (encapsuler) données et traitement au sein
d’une même entité : l’objet
Un objet est une entité informatique Dont les attributs décrivent l’état Dont les opérations(méthodes) décrivent le comportement
Un programme écrit en langage objet: Est un ensemble d’objets ayant chacun une structure et un
comportement C’est la résultante de la collaboration de ces objets (qui communiquent
par envoi de messages)
Approche objet Un programme devient un ensemble de petites entités informatiques qui interagissent et communiquent par messages
Historique des langages OO
ALGOL 1960
SIMULA 1967
EIFFEL1989
C++1983
OBJECTPASCAL
C1972
PASCAL
ADA
SMALLTALK 1976
OBJECTIVE C
JAVA1995
LISP 1957
C#2000
Les concepts de base
Objet, Classe, Attributs, Méthodes Encapsulation Cycle de vie Classification, Héritage Polymorphisme, classe abstraite, interface
L’objet
Un objet est défini par : Ses attributs (ses caractéristiques) Les opérations qu’il supporte (ses méthodes)
Un objet regroupe ainsi : Un aspect statique (sa structure, son état) Un aspect dynamique (son comportement)
L’objet
uneFenêtre
Attributs :point-sup-gauchepoint-inf-droittextureen-tête
Opérations : Activer ()Fermer ()Réduire (coeff)Agrandir (coeff)Déplacer (lieu)
unCompte
Attributs :numerosoldetitulaire
Opérations : Déposer (somme)Retirer (somme)AvoirSolde ()
uneVoiture
Attributs :couleur = bleue
poids = 979 kg
puissance = 12 CV
capacité carburant = 50 l
vitesse instantanée =50km/h
Opérations : Démarrer ()
Se déplacer ()
Mettre de l’essence ()
Objet et Classe Il est impossible de décrire chaque objet d’un système
Pour simplifier, pour abstraire, on décrit des classes d’objets avec: Des caractéristiques communes : Attributs Un comportement commun : Méthodes
Une classe est donc une abstraction, un concept
Objet et Classe
Les classes ont un double rôle : décrire et classer de façon abstraite des objets servir de « moule » à objets (mécanisme d’instanciation).
Attributs Les attributs définissent la structure d’un objet : ils sont nommés,
typés et peuvent posséder une valeur initiale L’état de l’objet correspond à la valeur des attributs à un instant
donné
unCompte
numérosolde : réel =0.0titulaire
Déposer (somme)Retirer (somme)AvoirSolde ()
Type de l’attribut
Valeur initialeNom de l’attribut
Méthodes
Structure d'un message :
Récepteur SélecteurParamètre ...
4462
4462 Déposer 100
Déposer
unCompte
Attributs :numérosoldetitulaire
Opérations : Déposer (somme)Retirer (somme)AvoirSolde ()
Nom de la méthode à activer
Nom de l’objet recevant le message
L’objet est sollicité de l’extérieur par un message
Il réagit à cette sollicitation en exécutant cette méthode
Méthodes
Une méthode est un « petit programme » qui exécute un traitement. Les méthodes sont décrites au niveau des classes. Chacune à un nom qui permet de l’activer.
Méthodes Les méthodes peuvent être publiques ou privées. Les méthodes publiques constituent l'interface de l'objet avec
l'extérieur. Les méthodes privées sont invisibles de l’extérieur.
Méthodes publiques
Méthodes privées
Données privées
Membres d ’objet
Comme on vient de le voir, les objets sont caractérisés par les données
et les méthodes qu’ils encapsulent;
chaque objet possède ses propres membres selon le modèle de sa
classe d ’appartenance.
Ce sont les variables d’objet et les méthodes d’objets.
Membres de classeLa classe peut elle même être caractérisée par des membres qui lui sont propres.
La classe Compte conserve le nombre total de comptes Compte.nbTotLa classe Compte propose une méthode qui retourne ce nombre
Compte.RetourneNb()
Ces membres n’existent qu’à l’unité; ils sont rattachés à la classe et sontpartagés par toutes les instances de la classe. On dit alors qu’ils sont statiques (qualifieur static en C++,Java, C#), car ilsexistent dès le début de l’application.
Ce sont les variables de classe et les méthodes de classe.
Membres de classe
Cette notion est très utile, à tel point que certaines classes ne font que proposer des membres statiques et ne sont pas destinées à être instanciées.
C ’est le cas en C# de la classe Math qui propose les données PI, E et les méthodes log, sin, exp , etc...
On dispose ainsi de nombreuses bibliothèques thématiques.
Les concepts de base
Objet, Classe, Attributs, Méthodes Encapsulation Cycle de vie Classification, Héritage Polymorphisme, classe abstraite, interface
Encapsulation
L’encapsulation consiste à masquer aux utilisateurs d’un objet les détails relevant de son implémentation (vue interne ou réalisation), et de ne laisser accessible que la vue externe ou interface.
Démarrer
SeDéplacer
Mettredelessence
Voiture
kilométrageconsommation
Attributs privés
Encapsulation : Types de visibilité
Types de visibilité d’un attribut ou d’une opération Public : visible de toutes les classes Protégé : visible de la classe et des sous-classes Privé : visible uniquement de la classe
Encapsulation
Limiter la visibilité, c’est : Protéger l’intérieur de l’objet Dissimuler la complexité Simplifier la maintenance Codifier les échanges avec l’extérieur
Encapsulation
Il est important de noter :
qu’un objet n’est connu que par son interface : les services qu’il peut rendre
qu’il est autonome : il est responsable des actions qu’il sait effectuer.
C# : une classe
class Compte{
public int numero;private decimal solde;public string titulaire;
public void Deposer (decimal somme){
solde += somme}public void Retirer (decimal somme){ solde -= somme }
}
class Compte{
public int numero;private decimal solde;public string titulaire;
public void Deposer (decimal somme){
solde += somme}public void Retirer (decimal somme){ solde -= somme }
}
C# : une classe
class Compte{
private int numero;....
public int GetNumero() {
return numero;}public void SetNumero(int num){
numero = num;}
....
class Compte{
private int numero;....
public int GetNumero() {
return numero;}public void SetNumero(int num){
numero = num;}
....
class Compte{
private int numero;....
public int Numero{
get{
return numero;}set{
numero = value;}
}
class Compte{
private int numero;....
public int Numero{
get{
return numero;}set{
numero = value;}
} Fonction d’accès aux attributs
Ou assesseurs et modifieurs Propriétés d’objets
Les concepts de base
Objet, Classe, Attributs, Méthodes Encapsulation Cycle de vie Classification, Héritage Polymorphisme, classe abstraite, interface
Cycle de vie de l’objet L’objet naît , vit , meurt : il a un cycle de vie
Création d’objet Allocation de mémoire à l’aide de new L’objet est initialisé grâce à un constructeur
Utilisation de l’objet : appel de méthodes Destruction d’objet
L’objet redevient mémoire L’allocation de mémoire est annulée
Cycle de vie de l’objetL'instanciation est le processus par lequel on crée de nouveaux objets
à partir du modèle défini par une classe.
Classe
I n s t a n c e s
L’opérateur new est utilisé pour créer des objets
(allocation de mémoire à partir de tas)
Cycle de vie de l’objetunCompte
Attributs :numérosoldetitulaire
Opérations : Déposer (somme)Retirer (somme)AvoirSolde ()
Classe
numéro 4462solde 200titulaire Paul
Instance de numéro 8765solde 5000titulaire Jean
Le monde abstrait des concepts
Le monde réel, concret
class Compte{
private int numero;private decimal solde;private string titulaire;public int Numero{
get{return numero;}set{numero = value;}
} public string Titulaire{
get{return titulaire;}set{titulaire = value;}
} public decimal Solde{
get{return solde;}}
public void Deposer (decimal somme){ solde += somme; }public void Retirer (decimal somme){ solde -= somme; }
}
class Compte{
private int numero;private decimal solde;private string titulaire;public int Numero{
get{return numero;}set{numero = value;}
} public string Titulaire{
get{return titulaire;}set{titulaire = value;}
} public decimal Solde{
get{return solde;}}
public void Deposer (decimal somme){ solde += somme; }public void Retirer (decimal somme){ solde -= somme; }
}
C# : Cycle de vie de l’objet
class Exemple{
static void Main(){
Compte leCompte = new Compte();
leCompte.Numero=4462;leCompte.Titulaire = “Paul”;leCompte.Deposer(200);
Console.WriteLine(leCompte.Solde) // écrit 200}
}
class Exemple{
static void Main(){
Compte leCompte = new Compte();
leCompte.Numero=4462;leCompte.Titulaire = “Paul”;leCompte.Deposer(200);
Console.WriteLine(leCompte.Solde) // écrit 200}
}
C# : Cycle de vie de l’objet
class Compte{private int numero;private decimal solde;private string titulaire;public int Numero{ get{return numero;} set{numero = value;}} public string Titulaire{ get{return titulaire;} set{titulaire = value;}}
public decimal Solde{ get{return solde;}}public Compte(){ numero=0;
solde=0.0M;titulaire=“”;}
public void Deposer (decimal somme){ solde += somme; }public void Retirer (decimal somme){ solde -= somme; }
}
class Compte{private int numero;private decimal solde;private string titulaire;public int Numero{ get{return numero;} set{numero = value;}} public string Titulaire{ get{return titulaire;} set{titulaire = value;}}
public decimal Solde{ get{return solde;}}public Compte(){ numero=0;
solde=0.0M;titulaire=“”;}
public void Deposer (decimal somme){ solde += somme; }public void Retirer (decimal somme){ solde -= somme; }
}
Constructeur par défaut
(généré par le compilateur si non codé)
C# : Cycle de vie de l’objet
class Compte{
public int numero;private decimal solde;public string titulaire;
public Compte (int num, decimal mt, string nom){
numero=num;solde=mt;titulaire=nom;
}
public void Deposer (decimal somme){ solde += somme; }public void Retirer (decimal somme){ solde -= somme; }
}
class Compte{
public int numero;private decimal solde;public string titulaire;
public Compte (int num, decimal mt, string nom){
numero=num;solde=mt;titulaire=nom;
}
public void Deposer (decimal somme){ solde += somme; }public void Retirer (decimal somme){ solde -= somme; }
}
Constructeur surchargé
C# : Cycle de vie de l’objet
class Compte{private int numero;private decimal solde;private string titulaire;public int Numero{ get{return numero;} set{numero = value;}} public string Titulaire{ get{return titulaire;} set{titulaire = value;}}
public decimal Solde{ get{return solde;}}public Compte (int num, string nom){ numero=num;
titulaire=nom;}public void Deposer (decimal somme){ solde += somme; }public void Retirer (decimal somme){ solde -= somme; }
}
class Compte{private int numero;private decimal solde;private string titulaire;public int Numero{ get{return numero;} set{numero = value;}} public string Titulaire{ get{return titulaire;} set{titulaire = value;}}
public decimal Solde{ get{return solde;}}public Compte (int num, string nom){ numero=num;
titulaire=nom;}public void Deposer (decimal somme){ solde += somme; }public void Retirer (decimal somme){ solde -= somme; }
}
Constructeur surchargé
C# : Cycle de vie de l’objet
class Exemple{
static void Main(){
Compte leCompte = new Compte(4462,“ Paul”);
leCompte.Deposer(200);
Console.WriteLine(leCompte.Solde) // écrit 200}
}
class Exemple{
static void Main(){
Compte leCompte = new Compte(4462,“ Paul”);
leCompte.Deposer(200);
Console.WriteLine(leCompte.Solde) // écrit 200}
}
Notion de référence L ’identifieur (leCompte) qui est attaché à l ’objet lors de l ’instanciation
puis qui permet de le manipuler s ’appelle une référence ( en C#), un pointeur (en C++) ou un handle(en Java )
Rien n’empêche que plusieurs références pointent sur le même objet
leCompte=new ComptetabCompte[5]=leCompteparamXX=leCompte
Dans ce cas, le garbage collector est vigilant et ne détruit pas l ’objet tant qu ’il estencore référencé.
numéro 4462solde 200titulaire Paul
Deposer (Somme)Retirer (Somme) AvoirSolde()
paramXX
tabCompte[5]
leCompte
Suppression d’objets en C# Impossible de détruire explicitement un objet
C# ne fournit pas d’opposé à new car une fonction desuppression est source de nombreuses erreurs
Oubli de détruire les objets Tentative de destruction d’un même objet plusieurs fois Destruction d’un objet actif
C’est le garbage collector qui détruit les objets Détruit les objets inaccessibles Réalloue la mémoire dans le tas Effectue cette tâche lorsque la mémoire est insuffisante
Suppression d’objets en C# Impossible de contrôler le moment ou un objet est détruit,
mais contrôle possible de ce qui se passe lors de la destruction
Par l’utilisation de la méthode Finalize (objets du framework) Par l’écriture d’un destructeur
class Compte{
~ Compte{
// instructions de nettoyage}
}
class Compte{
~ Compte{
// instructions de nettoyage}
}
A éviter …
Augmente la charge et
retarde la récupération mémoire
Les concepts de base
Objet, Classe, Attributs, Méthodes Encapsulation Cycle de vie Classification, Héritage Polymorphisme, classe abstraite, interface
Classification
Les classifications permettent de gérer la complexité en ordonnant
les objets au sein d'arborescences de classes d'abstraction
croissante. Substance
Corps Substance incorporelle
Corps animé Corps inerte
Animal Pierre
Esprit
Animal rationnel
Etre humain Ange
L’arbre de Porphyre(philosophe 3eme siècle après JC)
Classification
Personnel
Personnel Naviguant
PersonnelAu sol
Hôtesse del’air
PiloteHôtesse d’accueil
Technicien
Généralisation
La généralisation consiste àfactoriser les élémentscommuns d'un ensemble declasses dans une classeplus générale : la super-classe ou sur-classe
La classe Personnel est unegénéralisation de la classePersonnelAuSol
Personnel
Personnel Naviguant
PersonnelAu sol
Hôtesse del’air
PiloteHôtesse d’accueil
Technicien
Spécialisation
La spécialisation permet decapturer les particularités d'unensemble d'objets nondiscriminées par les classes déjàidentifiées.
la classe Pilote est unespécialisation de la classePersonnelNaviguant,qui est ellemême une spécialisation de laclasse Personnel …
Personnel
Personnel Naviguant
PersonnelAu sol
Hôtesse del’air
PiloteHôtesse d’accueil
Technicien
classe de base
classe dérivée
CA
CB
Relation d ’héritage
Généralisation
Spécialisation/Généralisation
L’héritage spécifie une relation « est une sorte de »
Spécialisation
Héritage
Une instance de la classePilote
Possède la structure définie sur la classe Pilote
Hérite de la structure définie sur la super-classe PersonnelNaviguant qui a elle-même hérité de la structure définie sur sa super-classe Personnel
Personnel
Personnel Naviguant
PersonnelAu sol
Hôtesse del’air
PiloteHôtesse d’accueil
Technicien
Héritage Les données membres de la classe de base deviennent donc données
à part entière de la classe dérivée
Un pilote a un nom, prénom, âge … qui lui viennent de la classe Personnel
Les services rendus par la super classe le sont aussi par la classe dérivée
Un pilote en tant que Personnel dispose d’un salaire qui peut être évalué sur l ’année
La classe fille rajoute ses propres données membres et services
Un pilote possède un nombre d’heures de vols ...
Héritage Héritage simple : dérivé d’une classe de base Héritage multiple : dérivé de plusieurs classes de base
Véhicules terrestres
Voiture
Véhicules terrestres Véhicules marins
Amphibie
C# restreint l’utilisation de l’héritage multiple : une classe ne peut hériter que d’une classe,
mais de plusieurs interfaces .
Héritage
Compte
Attributs :numérosoldetitulaire
Opérations : Déposer (somme)Retirer (somme)AvoirSolde ()
CompteEpargne
Attributs :taux
Opérations : CalculerInterêts ()
unCompteEpargne
Attributs :numérosoldetitulairetaux
Opérations : Déposer (somme)Retirer (somme)AvoirSolde ()CalculerInterêts ()
Est une sorte de
Hérite de
C# : Héritage
class Compte{
private int numero;protected decimal solde;private string titulaire;
public Compte(){ numero=0;
solde=0.0M;titulaire=“”;}
public Compte(int num){ numero=num;}public void Deposer (decimal somme){ solde += somme; }public void Retirer (decimal somme){ solde -= somme; }
}
class Compte{
private int numero;protected decimal solde;private string titulaire;
public Compte(){ numero=0;
solde=0.0M;titulaire=“”;}
public Compte(int num){ numero=num;}public void Deposer (decimal somme){ solde += somme; }public void Retirer (decimal somme){ solde -= somme; }
}
class CompteEpargne : Compte{
private decimal taux;
public CompteEpargne() : base(){ taux=0.0M;}public CompteEpargne(int num, decimal tx)
:base(num){ taux =tx;}
public void CalculerInterets (){
…}
}
class CompteEpargne : Compte{
private decimal taux;
public CompteEpargne() : base(){ taux=0.0M;}public CompteEpargne(int num, decimal tx)
:base(num){ taux =tx;}
public void CalculerInterets (){
…}
}
Constructeur de classe de base
Héritage : Types de visibilité Une opération d’une classe autre qu’une sous-classe n’a pas
accès aux attributs et opérations privés ou protégés
Une opération d’une sous-classe Ne peut pas accéder (consultation ou affectation) à l’attribut
privé de sa sur-classe Peut accéder (consultation ou affectation) à l’attribut protégé
de sa sur-classe
Privé =« Boite noire » de la classe Protégé=« Boite noire » de la hiérarchie de classe
Les concepts de base
Objet, Classe, Attributs, Méthodes Encapsulation Cycle de vie Classification, Héritage Polymorphisme, classe abstraite, interface
Polymorphisme En Programmation classique
Si x . type = "cercle " alors x, dessinerCercle
SinonSi x . type ="rectangle " alors
x, dessinerRectangleSinon
Si x . type = "triangle " alors x, dessinerTriangle
FinsiFinsi
FinSi
Polymorphisme On appelle polymorphisme (du grec signifiant « plusieurs
formes ») le fait de dissimuler des traitements différents derrière la même méthode.
Polymorphisme En Programmation objet
Le nom de la méthode réside dans la classe de base Les implémentations de la méthode résident dans les
classes dérivées
Figure
Dessiner()
Cercle
Dessiner()
Rectangle
Dessiner()
Triangle
Dessiner()
Polymorphisme Évolution du logiciel : si je veux dessiner un octogone
Ajout de la classe Octogone Il suffira de coder la méthode Dessiner dans la classe Octogone. Aucune autre modification ne sera nécessaire.
Figure
Dessiner()
Cercle
Dessiner()
Rectangle
Dessiner()
Triangle
Dessiner()
Octogone
Dessiner()
Polymorphisme C’est la propriété de donner le même nom (sélecteur
dans le message) À des comportements analogues Qui vont donner lieu à des réalisations plus ou moins différentes Selon le receveur du message
Une méthode virtuelle spécifie une implémentation possible d’une méthode qui peut être substituée par polymorphisme dans une classe dérivée
Une méthode non virtuelle ne peut pas être substituée dans une classe dérivée
C# : Implémentation de méthodes
class Figure{
…public virtual void Dessiner(…){
// instructions}
}
class Figure{
…public virtual void Dessiner(…){
// instructions}
}
Dans la classe de base
Une méthode override (de substitution) spécifie une autre implémentation d’une méthode virtuelle
C# : Implémentation de méthodes
class Cercle : Figure{
…public override void Dessiner(…){
// instructions}
}
class Cercle : Figure{
…public override void Dessiner(…){
// instructions}
}
Dans la classe dérivée
Identique en tous
points à la méthode
virtuelle :
- même type de retour
- même nom
- mêmes paramètres
Peut être substituée ...
Substitution de méthodesCompte
Attributs :numérosoldetitulaire
Opérations : Déposer (somme)Retirer (somme)AvoirSolde ()CalculerInterêts()
CompteEpargne
Attributs :taux
Opérations : CalculerInterêts ()
Est une sorte de
class Compte {
…public void virtual CalculerInterêts(){
… }
}class CompteEpargne : Compte {
…public void override CalculerInterêts(){
… }
}
class Compte {
…public void virtual CalculerInterêts(){
… }
}class CompteEpargne : Compte {
…public void override CalculerInterêts(){
… }
}
Implicitement virtuelle
Jamais static ni private
Classes abstraites Ce sont des classes qui ne seront jamais instanciées. Elles ne servent qu’à modéliser l ’univers. Une bonne règle :
classes terminales :concrètes classes non terminales : abstraites
(qualifieur abstract en C++, Java et C#)
Classes abstraites
Figure
Dessiner()
Cercle
Dessiner()
Rectangle
Dessiner()
Triangle
Dessiner()
Octogone
Dessiner()
La classe de base existe dans le seul but de présenter le nom de la méthode dans la hiérarchie
Classes abstraites
abstract class Figure{
int i;public abstract void Dessiner();public virtual bool Effacer(){ …}
}class Cercle():Figure{
public override void Dessiner(){ …}public override bool Effacer(){ …}
}
abstract class Figure{
int i;public abstract void Dessiner();public virtual bool Effacer(){ …}
}class Cercle():Figure{
public override void Dessiner(){ …}public override bool Effacer(){ …}
}
Ne peut pas être instanciée
Pas de corps de méthode
implicitement virtuelle
Les classes abstraites sont utilisées pour fournir des implémentations de classes partielles, étendues dans les classes dérivées
Seules les classes abstraites peuvent déclarer des méthodes abstraites
Les méthodes abstraites ne peuvent pas contenir de corps de méthode
Les méthodes abstraites sont virtuelles
Interfaces Une interface spécifie un contrat auquel toutes les classes
dérivées doivent adhérer
interface IConstructible{
… void Dessiner(…);
}
interface IConstructible{
… void Dessiner(…);
}
Le nom doit commencer par la lettre I
Implicitement publique
Pas de corps de méthode
Interfaces Une classe peut implémenter zéro (ou plusieurs)
interface(s) interface IConstructible{
void Dessiner(…);}interface IManipulable{
void Copier(…); void Coller (…);
void Couper(…);}class Figure :IConstructible, IManipulable {
…}
interface IConstructible{
void Dessiner(…);}interface IManipulable{
void Copier(…); void Coller (…);
void Couper(…);}class Figure :IConstructible, IManipulable {
…}
Interfaces Toutes les méthodes déclarées dans les interfaces doivent
être implémentées
class Figure :IConstructible, IManipulable {
public void Dessiner(…){ …}public void Copier(…){ …} public void Coller (…){ …} public void Couper(…){ …}
class Figure :IConstructible, IManipulable {
public void Dessiner(…){ …}public void Copier(…){ …} public void Coller (…){ …} public void Couper(…){ …}
Identique en tous
points à la méthode
d’interface:
- même type de retour
- même nom
- mêmes paramètres
Peut être virtuelle ou
non ...
Interfaces Une classe implémente une interface et étend une classe de
base
Cercle
Dessiner()
Figure
Dessiner()
IConstructible
Dessiner()Interface
Classe
abstraite
Classe
concrète
Uniquement des opérations
Peut contenir une implémentation
Doit implémenter toutes les opérations issues
de l’héritage
Interfaces
interface IConstructible{
void Dessiner();}abstract class Figure :IConstructible{
…public virtual void Dessiner(){}
}class Cercle : Figure{
public override void Dessiner(){}
}
interface IConstructible{
void Dessiner();}abstract class Figure :IConstructible{
…public virtual void Dessiner(){}
}class Cercle : Figure{
public override void Dessiner(){}
}
CONCLUSION Qu’est-ce qu’un programme ?
Il n’y a plus de programme au sens strict Chaque entité est conçue indépendamment
D’où un gain de modularité D’où aussi la nécessité de maîtriser les interactions Permet de modéliser la réalité telle qu’elle est
conceptualisée
Principes Créer des classes qui vont permettre d’instancier des objets
Principe de réification
Communiquer par envoi de messages Principe de délégation
Utilisation de l’héritage Conception par affinage et abstraction