Upload
duonghanh
View
226
Download
0
Embed Size (px)
Citation preview
Université A. Mehri. Constantine (2) Année Universitaire 2016-2017 Faculté NTIC 2ère Année MI Département MI Programmation Orientée Objet (POO)
Chapitre 1 : Rappel
Principes de base de la POO
1. Objets et Classes
2. Héritage et Polymorphisme
Introduction Développement d’un logiciel : Modèle en cascade
SADT, SA-RT, MERISE, OMT, UML, …
Fortran, Pascal, C++, SmallTalk, Java, ..
2
Introduction Implémentation d’un logiciel Programmation procédurale Programmation objets
Données
Un programme est composé de procédures/fonctions qui effectuent des traitements sur des données
Un programme est composé de plusieurs objets qui contiennent ▸ des données ”internes” ▸ des traitements manipulant ces données internes ou d’autres données.
• La programmation orientée objet n’est pas forcement facile pour tout le monde. • C’est un ensemble de solutions (héritage, surcharge, interface,. . . ) qu’il faut connaître avant de les assembler. 3
Programmation Orientée Objet
La POO consiste à : • Prolonger la logique de la programmation impérative et modulaire. • Mieux coller à la réalité du problème pour une modélisation “plus naturelle”.
On doit réfléchir en termes d’objets
Un problème est défini par un ensemble d’objets qu’il faut modéliser
4
Programmation Orientée Objet
• Tout est objet
• Un programme est un ensemble d’objets qui communiquent par envoi de messages
• Chaque objet a un type
• Chaque objet a sa propre mémoire constituée éventuellement d’autres objets • Tous les objets du même type peuvent recevoir le même type de messages
Introduction Caractéristiques d’un langage à objet
5
Programmation Orientée Objet
JAVA se base sur : VM de Lisp, Concepts de Smalltalk, Typage d’ADA, Syntaxe de C
Introduction Langage JAVA
6
est développé par Sun, gratuit, ouvert et portable
est orienté objet
est fortement typé
Nombreuses bibliothèques/API (gratuites)
est compilé (En bytecode, i.e., code intermédiaire indépendant de la machine
est interprété (Le bytecode est interprété par une machine virtuelle Java)
Mécanismes de traitement des erreurs (exceptions)
gestion dynamique de la mémoire (Garbage Collector). Pas d’opérateur de destruction des objets
Multi-threading
Introduction Langage JAVA
7
Portabilité :
• Un des grands principes de Java :
“compile once, run everywhere”
• Principe : indépendance OS/architecture
utilisation d’une (J)VM (Pour l’exécution du bytecode)
multi plate-forme
Introduction Langage JAVA
8
Introduction Conception : UML (Unified Modeling Language)
Définition
UML est un langage de modélisation Notation standard pour l’analyse et la conception construite par l’Object Management Group (OMG) Première version standard en 1997 Un ensemble de diagrammes (classes, séquences, activités, etc.) qui permet de modéliser les aspects statiques et dynamiques d’une application
Dans ce cours :
Nous utilisons le diagramme de classes pour représenter les classes d’une application et leurs relations. L’approche retenue est simplifiée. 9
Classe v.s Objet
Mérimée
La tricheuse
Un objet (instance de classe) est une représentation concrète d’une classe. lapin, Imen
Imen
Samia
lapin
tigre
Classe Lecteur
Classe Animal
Classe Livre
Une classe est une représentation abstraite d’un objet : Lecteur, Livre,
..
Des objets similaires (même structure et même comportement) peuvent être informatiquement décrits par une même abstraction : Une classe
10
Classes et Objets
Classe/Définition
Une classe est un moule à partir duquel sont crées les objets. Une classe définit un nouveau type Une classe est une entité statique Une classe est une unité de compilation A chaque classe publique correspond un fichier java de même nom (.java)
Techniquement
La classe décrit l’état et le comportement des objets
Classe
attributs/Champs/variables Méthodes
11
public class NomDeClasse { constructeurs attributs (variables d’instance / variables de classe) méthodes (méthodes d’instance/ méthodes de classe) ...}
classes internes (Voir TP)
Déclaration de constructeur : [modificateur d’accès] nom-classe ([params*]) {..traitement..} Déclaration d’une variable : [modificateur d’accès] [static] [final] type nom-variable //type peut être primitif ou classe prédéfinie Déclaration de méthode : [modificateur d’accès] [static] type nom-meth ([params*]) {... traitement ... [return expression;] // si type # void } Req : modificateur d’accès = private, protected, public
Classes et Objets
Classe/Structure
Classe
12
Principe d’encapsulation
Règle: Cacher l’implémentation d’une classe (variables et code de méthodes) et ne rendre visible que son interface. Celle-ci sera invoquée par les objets.
Nom Classe
+ att1
+ att2
…
+ méth1
+ méth2
- méth3
…
+ : public
- : private
# : protected
souligné : static
Classes et Objets
Classe/Représentation UML
Classe
Contrat ou Interface d’une classe
13
public class Vehicule {
private String marque;
private int age;
private static int nbV=0;
public Vehicule (String marque) {
this.marque = marque;nbV++;}
public Vehicule (String marque, int age){
this(marque);this.age=age;}
public int getAge() {return age;}
public String getMarque(){return marque;}
public static boolean same(Vehicule v1, Vehicule v2)
{ return v1.getMarque()==v2.getMarque() &&
v1.getAge()==v2.getAge();}
public static int nbVehicule() {return nbV;}
public static void main(String[] args) {
Voiture v ;
v=new Voiture ("Citroên", 7);
System.out.println (v.getMarque());
System.out.println (Vehicule.nbV);
}}
Variables d’instance
Variables de classe
Constructeurs surchargés
Méthodes d’instance
Méthodes de classe
Objet de type Vehicule
Vehicule
- marque
- age
- nbV …
+ getMarque()
+ getAge()
+ nbVehicule()
+ same()
Classes et Objets
Exemple
Classe
14
Identificateur = new + constructeur [param*]
Exemple Voiture v = new Voiture ("Citroên", 7);
C’est une référence pour
manipuler l’objet
Class Vehicule
#12 nbV
constructeurs
méthodes Vehicule v # 1 # 1 @ class Vehicule
marque = Citroên age = 7
• Un identificateur non initialisé prend la valeur null
• Chaque identificateur correspond à un seul objet • Deux identificateurs peuvent faire référence à un même objet • Chaque appel à new crée un nouvel objet
Classes et Objets
Objet/ Création ou Instanciation
Objet
15
Identificateur.message
Exemple
v.getMarque()
Classes et Objets
Objet/ Manipulation
Objet
attribut (envoi du message d’accès à un attribut de l’objet)
methode([params*]) (envoi du message d’invocation (exécution) de la méthode de l’objet)
Remarque : En Java, une méthode ne peut pas être invoquée seule, elle est toujours appelée sur un objet (Ex: v.getMarque()) ou sur une classe, pour les méthodes static (Ex: Vehicule.nbVehicule())
16
Une association modélise une relation bidirectionnelle entre deux classes. Pour chaque association, on a :
• nom de l’association
• Cardinalités qui expriment le nombre d’instances associées (multiplicité) :
1 , 1..n, 0..1, 1..*,..
Exemple : Une personne posséder 0 ou plusieurs Vehicules et un Vehicule a un seul propriétaire
Nom de relation
class A cardB Card A class B
possède
Vehicule 0..n 1 Personne
Représentation UML
Relations entre classes
Association/Définition
Association
Possède
17
Les associations entre classes sont traduites en java par des références (objets membres). Le type de référence dépend de la cardinalité.
Public class Vehicule {
……
Personne proprietaire;
……}
Public class Personne{
……
Vehicule[] Vehicules;
……}
Remarque1 : Les associations peuvent être dirigées, ce qui contraint la visibilité et la navigation dans le modèle.
Remarque2 : Une association sans cardinalités exprime une utilisation possible des objets d’une classe.
Rôles
Relations entre classes
Association/Traduction en Java
Association
possède
Vehicule 0..n 1 Personne
Possède
18
Définition
Agrégation/Composition : relation unidirectionnelle entre deux classes, indiquant que les instances d’une classe sont les composants d’une autre. Elle exprime une relation de contenance.
Relations entre classes
Agrégation/Composition
Agrégation/Composition
19
L’Agrégation exprime une relation de composition faible les objets agrégés ont une durée de vie indépendante de celle de l’agrégat
Représentation UML
Exemple
public class Bibliothèque{ Livre[] livres; … public void ajouterLivre(Livre l) { Livres[i]=l;} … }
public class Livre{ String titre; … public void ranger() { ……} public void archiver() {… } … }
Bibliothèque
Livre
Relations entre classes
Agrégation/ Définition
Agrégation/Composition
Traduction en Java
agrégat agrégé
Les agrégés sont crées indépendamment de
l’agrégat
20
La Composition exprime une relation de composition forte les objets agrégés (composites) ont une durée de vie dépendante de celle de l’agrégat (composant)
Exemple
public class Vélo{ Roue roueAvant; Roue roueArrière; … public Vélo () {roueAvant= new Roue(); roueArrière= new Roue(); … }
public class Roue{ Int rayon; … public Roue() { rayon = 40;} public void réparer() {… } … }
Relations entre classes
Composition/ Définition
Agrégation/Composition
Représentation UML
composant composite
Traduction en Java
Les composites sont crées avec le composant
21
L’héritage établit une relation de spécialisation/généralisation entre les classes. Il permet de construire des classes (sous-classes) à partir de classes existantes (classes mères, super classes, classes de base).
Exemple Voiture : Vehicule ayant un moteur
Relations entre classes
Héritage/ Définition
Héritage
Représentation UML
Traduction en Java Vehicule
Voiture Vélo
Object
Remarque : Toutes les relations entre les classe (Héritage, agrégation, etc.) permettent la réutilisation des composants logiciels (classes) 22
• Une sous-classe hérite des attributs de sa super-classe • Une sous-classe hérite des méthodes de sa super-classe • Une sous-classe spécialise sa super-classe, en ajoutant de
nouveaux attributs et/ou de nouvelles méthodes • Une sous-classe spécialise sa super-classe, en redéfinissant les
méthodes de sa super-classe. • Les instances de la sous-classe sont aussi des instances de la classe
mère.
Relations entre classes
Héritage/Caractéristiques d’une sous-classe
Héritage
Surcharge (Overloading) V.S Redéfinition (Overriding) des méthodes
Surcharge : permet la définition de plusieurs méthodes de même nom au niveau d’une même classe (les méthodes surchargées sont différentes par le nombre et le type de leurs arguments). Elles ont des implémentations différentes. Redéfinition : permet la redéfinition (fournir un nouveau code en préservant la signature) d’une méthode de la super-classe dans une sous-classe. La méthode est dite polymorphe.
23
public class Voiture extends Vehicule{ protected Moteur moteur; protected static int nbRoues=4; public Voiture(String marque, int age) { super(marque,age); moteur= new Moteur();} public void identifie() { System.out.println ("Je suis une voiture");} public void démarrer(){moteur.démarrer();} public String toString() {return super.toString() + "Nombre de roues : "+nbRoues;} }
Relations entre classes
Exemple : On crée les classes Voiture et Vélo, sous classes de Vehicule
Héritage
public class Vehicule extends Object { Protected String marque;
Protected int age;
public Vehicule(String marque) { this.marque = marque;nbV++;}
public Vehicule(String marque, int age){this(marque); this.age=age;}
public void identifie(){ System.out.println("Je suis un Vehicule");} public String toString() {return "Age : "+age+" Marque :"+marque;}}
public class Vélo extends Vehicule{ protected Pédale pédales; protected static int nbRoues=2; public Vélo (String marque, int age) { super(marque,age); pédales = new Pédale();} public void identifie() { System.out.println("Je suis un Vélo"); } public void démarrer(){pédales.démarrer();} public String toString() {return super.toString() + "Nombre de roues : "+nbRoues;} }
24
Voiture v = new Voiture ("Peugeot" , 4); v est de type Voiture Vehicule Object
Relations entre classes
Héritage de type/Caractéristiques des objets de classes dérivées
Héritage
Tout objet d’une classe dérivée hérite le type de sa classe et celui de toutes ses super-classes (transtypage ascendant ou UpCusting)
Vehicule
Vélo
Object
Voiture
Remarque : L’ensemble des classes Java forme une hiérarchie avec une racine unique (Object)
25
Principe Le polymorphisme permet d’obtenir un comportement adapté à chaque type d’objet, sans avoir besoin de tester sa nature de quelque façon que ce soit.
il se traduit par :
1. Le principe de substitution relatif au polymorphisme des objets. 2. Le mécanisme de liaison dynamique relatif au polymorphisme des méthodes
Relations entre classes
Polymorhisme
Héritage
26
Principe Consiste à affecter à une variable objet d’une classe non seulement une référence à un objet de la classe, mais aussi une référence à un objet d’une sous-classe Transtypage descendant (DownCusting)
Relations entre classes
Principe de substitution
Héritage/Polymorphisme
public class TestVehicule { public static void main ( String[] args) { Vehicule monVehicule ; monVehicule = new Vélo(" Alpha " , 2); monVehicule = new Voiture ("Cotrôen" , 6); }}
Type déclaré
Type réel
27
Principe La résolution d’une méthode se fait en deux temps : 1. au compile time : on vérifie si la méthode est possible sur le type déclaré de
l’objet; 2. Au run time : on cherche la méthode la plus précise étant donné le type réel
ou effectif de l’objet Mécanisme de liaison dynamique
Relations entre classes
Principe de liaison dynamique
Héritage/Polymorphisme
Résolution de la méthode : Compite time: Méthode impossible (elle N’appartient pas à l’interface du type déclaré)
Résolution de la méthode : Compite time: Méthode possible Run time: Appliquer identifie() définie dans Vélo
28
public class TestV { public static void main (String[] args) { Vehicule monVehicule; monVehicule = new Vélo (" Alpha " , 2); monVehicule.identifie(); monVehicule.demarrer(); } }
Correction : ((Vélo) monVehicule).demarrer() Transtypage explicite
Remarque : Le transtypage explicite peut être évité en utilisant les méthodes abstraites (Voir Chapitre 2)