Chapitre 1 : Rappel - Djamel Benmerzougdbenmerzoug.e-monsite.com/medias/files/poo-chapitre1.pdf ·...

28
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

Transcript of Chapitre 1 : Rappel - Djamel Benmerzougdbenmerzoug.e-monsite.com/medias/files/poo-chapitre1.pdf ·...

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)