I21 Algorithmique et programmation II David Gross-Amblard, Joël Savelli IEM-uB 2008-2009 - GFDL 1.2 CM 4/8 v2.

Slides:



Advertisements
Présentations similaires
Spécialisation/généralisation Héritage Polymorphisme.
Advertisements

Spécialisation/généralisation Héritage Polymorphisme
Leçon 3 : Héritage IUP 2 Génie Informatique
Programmation orientée objet
Langage Oriente Objet Cours 4.
Master 1 SIGLIS java Lecteur Stéphane Tallard Chapitre 4 – Structures de contrôle.
Introduction au paradigme objet Concepts importants surcharge (overload) redéfinition (override) Définition d’une classe Définition des attributs.
77 Utilisation des classes (suite). 7-2 Objectifs A la fin de ce cours, vous serez capables de : Définir des méthodes surchargées dans une classe Fournir.
Classes abstraites et Interfaces
Introduction au paradigme orienté-objet (suite)
POO-L3 H. Fauconnier1 Supplément gratuit…. POO-L3 H. Fauconnier2 Entrée-sortie public static void main(String[] args) { // sortie avec printf ou double.
Design Pattern: Decorator
1 IFT 6800 Atelier en Technologies dinformation Le langage de programmation Java chapitre 3 : Classes et Objects.
Cours 4 Héritage (suite).
COURS DE PROGRAMMATION ORIENTEE OBJET :
Héritage et composition
LIFI-Java 2004 Séance du Mercredi 22 sept. Cours 3.
La notion de type revisitée en POO
11/04/ L'héritage Cours 7 Cours 7.
Tutorat en bio-informatique
Les classes présenté par: RAHMOUNE RIME / ZEKRI SELMA.
Les classes et les objets Les données finales class A { … private final int n = 20 ; // la valeur de n est définie dans sa déclaration … } class A { public.
Cours du 5 novembre.
Héritage H. Batatia. plan Notion (que signifie l’héritage) Ecriture en java Héritage multiple (interdit) Instanciation (partie propre et partie héritée)
La programmation par objets Principes et concepts Etude de Smalltalk.
Cours 4 (14 octobre) Héritage. Chapitre III Héritage.
Introduction à la programmation objet avec java
Héritage Conception par Objet et programmation Java
C++ Les fonctions. Présentation Utilité : Dès qu'un programme dépasse la centaine de lignes de code, il est pratique de pouvoir le décomposer en plusieurs.
I21 Algorithmique et programmation II David Gross-Amblard, Joël Savelli IEM-uB GFDL 1.2 CM3 v2.1.
Développement à l'Aide de Langages Dynamiques : Smalltalk module IT308: Méthodologies et outils logiciels Nada Ayad, Damien Cassou et Annabelle Souc.
CINI – Li115 1 Semaine 9 Algorithmes de tri ● Introduction ● Tri à bulle ● - principe ● - algorithme ● - efficacité ● Tri par sélection ● - principe, algorithme,
Stéphane Frénot, Frederique Laforest, Frédéric Le-Mouël IJA 1 TD 6 IJA Structures de données JAVA.
I21 Algorithmique et programmation II David Gross-Amblard, Joël Savelli IEM-uB GFDL 1.2 CM2 version 2.
1 Programmation en C++ C++ de base ● Programme C++ ● Variables, objets, types ● Fonctions ● Namespace ● Tests ● Boucles ● Pointeurs, références.
Programmation orientée objet AppInventor ArduBlock Communication
Modèle objet : les classes
java : l'héritage (rappel)
Environnement de développement des BD
Introduction au Langage Pascal
Programmation en C++ Héritage
Pas de variable globale
Les notions de classe et d'objet
Algorithmique et programmation de modèles numériques
Javadoc et débogueur Semaine 03 Version A17.
I21 Algorithmique et programmation II
Principes de programmation (suite)
Langages de programmation TP7
Les bases de données et le modèle relationnel
JAVA et POO : Notion d'héritage
Principes de programmation (suite)
Langages de programmation TP10
Cours Programmation Orientée Objet (POO) 2eme année Licence-LMD
Chapitre 2: Les classes et les objets
E) Constructeurs et héritage
Les interfaces en PHP.
Programmation en C++ C++ de base
Modélisation avec UML 2.0 Partie II Diagramme de classes.
Programmation Orientée Objet C# El Akel Bouchra ISMONTIC Tanger 2013/2014.
Les classes et les objets
Programmation Orientée Objet MMI 2ème année – S3
Schéma de conception Factory Method Exemple
Principes de programmation (suite)
INTERFACE ET POLYMORPHISME
Variables et accès en Java
Retour sur les interfaces
Jérôme CUTRONA PHP objet Jérôme CUTRONA 08:30:34 Programmation Web
Bases de données Singleton pour la connexion
TP N°6: Construction d’un Serveur Multi-Client
Transcription de la présentation:

I21 Algorithmique et programmation II David Gross-Amblard, Joël Savelli IEM-uB GFDL 1.2 CM 4/8 v2

i IEM / uB GFDL Encapsulation Déclaration Instanciation Constructions Accès aux membres et droits d'accès Destruction d'instances Accesseurs : un peu de modélisation Membres de classe

i IEM / uB GFDL 1.23 Membres de classe Où toute la lumière sera faite sur l'affreux « static »

i IEM / uB GFDL 1.24 Membres de classe ● Membres de classe, ou membres statiques ● Indiqués par le mot clé static class Etudiant { public int nbJeton; // attribut public static int nbEtudiant; // attribut de classe public static Etudiant fromString(String s) // méthode {...} // de classe... }

i IEM / uB GFDL 1.25 Attributs de classe / partagés ● Attributs partagés par toutes les instances (Etudiant e1, e2) e1.nbJeton=5; e2.nbJeton=6; e1.nbEtudiant=5; e2.nbEtudiant=6; // modifie précédente valeur nbJeton : 5nbJeton : 6 NbEtudiant : 6 e1 :e2 :

i IEM / uB GFDL 1.26 Membres de classe ● N'ont pas besoin d'instanciation pour être utilisés Etudiant e; // pas de new System.out.println(e.nbEtudiant); System.out.println(e.fromString(''John Doe'')); ● Habituellement, accès par le nom de classe System.out.println(Etudiant.nbEtudiant); System.out.println(Etudiant.fromString(''John Doe''));

i IEM / uB GFDL 1.27 Modélisation ? ● Membres de classes : propriétés et traitements concernant la classe mais pas une instance particulière ● Ex. d'attribut de classe : – Propriété statistique sur l'ensemble des instances (nb total d'instance, moyenne d'un attribut,...) ● Ex. de méthode de classe : – Traitement ne nécessitant pas d'instance particulière

i IEM / uB GFDL 1.28 Ex. : compter les instances class Etudiant { public static int nbEtudiant=0; // initialisation public Etudiant(){ // si création d'une instance... nbEtudiant++; // incrémentation du compteur partagé }

i IEM / uB GFDL 1.29 Ex. : méthodes de classes ● Fabriquer un Etudiant à partir d'un texte descriptif (pas d'instance au début) public static Etudiant fromString(String s) // méthode // de classe String nom=analyseNom(s);... int annee=analyseAnnee(s); return new Etudiant(nom,prenom,jour,mois,annee); }

i IEM / uB GFDL Ex. : relation d'équivalence ● Egalité entre 2 étudiants : pas liée à un étudiant particulier public static boolean equals(Etudiant e1, Etudiant e2){ if ((e1.getNom().equals(e2.getNom()) &&...) return true; return false; }

i IEM / uB GFDL Ex. : relation d'équivalence ● Mais pour le equals non-statique ? ● Utiliser la version statique avec l'objet courant en paramètre public boolean equals(Etudiant e){ return Etudiant.equals(this,e); } ● this : référence à l'objet courant, disponible dans le corps des méthodes (non-statiques)

i IEM / uB GFDL Ex. de membres de classe ● System.out.println(); – System : classe – out : attribut statique de System (de type PrintStream) – println() : méthode (non-statique) de l'objet out ● Math.random(); – Math : classe – random() : méthode statique de Math

i IEM / uB GFDL En conclusion ● Membres de classe : très rares cas d'utilisation ● A partir de maintenant, toute utilisation de static devra être très fortement motivée ! (sinon pan sur les doigts)

i IEM / uB GFDL Mais alors pourquoi...?? ● Java : exécution de la méthode main de votre classe ● Exécuteur : ne fait pas d'instanciation, donc main nécessairement static ● Donc tous les attributs utilisés par main : static ● Donc toutes les méthodes utilisées : static ● Horreur...

i IEM / uB GFDL Bonne pratique class Main { public static void main(String[] arg){ // code pour analyser la ligne de commande arg... MonProgramme p=new MonProgramme(); p.demarrer(); } ● Et c'est tout : tout est dans la classe MonProgramme, sans aucun static

i IEM / uB GFDL Encapsulation Déclaration Instanciation Constructions Accès aux membres et droits d'accès Destruction d'instances Accesseurs : un peu de modélisation Membres de classe

i IEM / uB GFDL II. Programmation par objet 1. Motivation 2. Encapsulation 3. Héritage 4. Initiation à la modélisation

3. Héritage ● Motivation ● Définition ● Surcharge et héritage ● Polymorphisme de classe ● Classe abstraite ● Héritage multiple ● Règles de visibilité

i IEM / uB GFDL Principes de la programmation objet ● Encapsulation : rassembler en un nouveau type la représentation et les traitements d'une notion abstraite – ex. : notion d'étudiant : type Etudiant ● Héritage : matérialiser la relation d'héritage (des représentations, des traitements) entre les notions abstraites – ex. : un etudiant est une personne – le type Etudiant hérite (quoi) du type Personne

i IEM / uB GFDL Motivation ● Un étudiant a un nom, un prénom, une date de naissance, des notes ● Une personne a un nom, prénom, date de naissance ● Concrètement, Etudiant : classe avec accesseurs (compliqués), constructeurs,... ● Nombreuses similitudes entre personne et etudiant (ex. attribut nom, methode setDateNaissance);

i IEM / uB GFDL Copier/coller ● Première approche : – copier/coller les attributs et le code de setDateNaissance dans Personne ● Avantage : – rapide ● Inconvénient : – Si vermine dans setDateNaissance, on l'a copiée – Si amélioration à faire, il faut (penser à) la faire aux deux endroits

i IEM / uB GFDL Héritage ● Deuxième approche : on observe que – Propriétés de Personne : incluses dans Etudiant (nom, prenom,date de naissance) – Traitements de Personne : inclus dans Etudiant (les accesseurs aux précédentes propriétés) – On pose que Etudiant est une sorte de Personne, avec des compléments : notes, etc. ● Avantage – Toute amélioration à Personne sera repercutée sur Etudiant : réutilisation du code

3. Héritage ● Motivation ● Définition ● Surcharge et héritage ● Polymorphisme de classe ● Classe abstraite ● Héritage multiple ● Règles de visibilité

i IEM / uB GFDL Héritage ● La classe Etudiant hérite de Personne ● (Etudiant est une sorte de Personne) ● Personne est la classe-mère / super-classe de Etudiant Etudiant Personne

i IEM / uB GFDL Héritage class Personne { private String nom,prenom; private int jourNaissance, moisNaissance, anneeNaissance; public Personne(String inom, String iprenom, int ijn,int imn,int ian){... } public void afficher(){sopln(prenom+'' ''+nom}; public void setDateNaissance(int ijn,int imn,int ian){ // vérification de la cohérence de la date }

i IEM / uB GFDL Etudiant hérite de Personne Class Etudiant extends Personne { private double notei21,notei22; private boolean aSesNotes; public void setNotes(double i21,double i22){... }

i IEM / uB GFDL Exemple d'accès Personne p=new Personne(''Doe'','John',11,1,1980); p.setDateNaissance(11,2,1980); // défini dans Personne p.setNotes(17.0,15.5); // invalide : pas défini dans Personne (une Personne n'est pas une sorte d'Etudiant)

i IEM / uB GFDL Exemple ● Etudiant e=new Etudiant(''Doe'','John',11,1,1980); // constructeur hérité de Personne ● e.setDateNaissance(11,2,1980); // hérité de Personne ● e.setNotes(17.0,15.5); // valide : défini dans Etudiant

3. Héritage ● Motivation ● Définition ● Surcharge et héritage ● Polymorphisme de classe ● Classe abstraite ● Héritage multiple ● Règles de visibilité

i IEM / uB GFDL Surcharge et héritage ● Personne a une méthode afficher() ● Possibilité de redéfinir afficher() pour Etudiant (remplace/surcharge la méthode héritée) class Etudiant {... public void afficher(){ sopln(getNom()+'' ''+getPrenom()+'', étudie à l'UB''); }

i IEM / uB GFDL Surcharge du constructeur ● notei21,notei22 : pas dans Personne, mais dans Etudiant ● où a lieu l'initialisation de notei21, notei22, aSesNotes ? ● Surcharger le constructeur de Personne dans Etudiant ● Appeler avant le constructeur de Personne (pour initialiser nom, prenom, etc.)

i IEM / uB GFDL Surcharge du constructeur class Etudiant { public Etudiant(String inom,String iprenom,int ijn,int imn,int ian){ super(inom,iprenom,ijn,imn,ian); // appel du constructeur de Personne, super- classe aSesNotes=false; // initialisation attribut propre de Etudiant }... }

3. Héritage ● Motivation ● Définition ● Surcharge et héritage ● Polymorphisme de classe ● Classe abstraite ● Héritage multiple ● Règles de visibilité

i IEM / uB GFDL Typage et héritage ● Comme Etudiant hérite (est une sorte de) Personne, on peut fournir un Etudiant chaque fois qu'une Personne est attendue Personne p; p=new Etudiant( ''Bueller'', ''Ferris'',4,7,1970 ); // valide sopln(p.getNom()); // valide : défini dans Personne sopln(p.getNotei21()); // invalide : p est une Personne, d'après le typage

i IEM / uB GFDL Polymorphisme ● Polymorphisme : une variable peut avoir des types différents à différents moments de l'exécution ● Ex. langages à typage faible, sans déclaration (shell, PHP,...) $toto=''12 est mon nombre''; // déclaration à la volée print $toto + 5 // $toto vue comme int, affiche ● Java : typage fort (déclaration préalable), monomorphique

i IEM / uB GFDL Polymorphisme en Java ● Polymorphisme de classe ● Exemple précédent : variable déclarée de type Personne contenant un Etudiant ● Mieux : Personne[] t=new Personne[2]; t[0]=new Personne(''Jean'',''Saisrien'',1,1,2000); t[1]=new Etudiant(''Anne'','Onyme'',3,5,1980);

i IEM / uB GFDL Polymorphisme de classe ● Tableau a contenu polymorphe ● Cohérence maintenue par héritage ● Impact de la surcharge des méthodes: t[0].afficher(); >Jean Saisrien t[1].afficher(); >Anne Onyme, étudie à l'UB ● Méthode à exécuter connue seulement à l'exécution, pas à la compilation (dépend du type) : liaison dynamique

3. Héritage ● Motivation ● Définition ● Surcharge et héritage ● Polymorphisme de classe ● Classe abstraite ● Héritage multiple ● Règles de visibilité

i IEM / uB GFDL Classe abstraite ● Ex. formaliser la notion d'Etre et de Chat Etudiant Personne Etre Chat

i IEM / uB GFDL Classe abstraite ● Formaliser : ''tout être a une masse'' ● attribut masse dans Etre ● Formaliser : ''tout Etre peut être affiché'' ● garantir que tout descendant de Etre possède une méthode void afficher() ● Définir la méthode dans Etre ● Mais quel corps ? ● Aucun : méthode abstraite

i IEM / uB GFDL Classe abstraite abstract class Etre { public abstract void afficher(); // pas de corps } ● Si une méthode est abstraite, la classe l'est aussi ● Toutes les méthodes d'une classe abstraite ne sont pas nécessairement abstraites

i IEM / uB GFDL Classe abstraite ● Il est invalide d'instancier une classe abstraite Etre e=new Etre(); // invalide ● Toute classe descendante d'une classe abstraite, ne définissant pas une des méthodes abstraite, est abstraite

i IEM / uB GFDL Classe abstraite class Chat extends Etre { public void appelerLeChat(){ secouerSacCroquettes(); } } ● Invalide : – classe non marquée abstraite et méthode afficher() pas définie

i IEM / uB GFDL Classe abstraite abstract class Chat extends Etre { public void appelerLeChat(){ secouerSacCroquettes(); } } ● Valide, mais ne peut être instanciée

i IEM / uB GFDL Classe abstraite class Chat extends Etre { public void appelerLeChat(){ secouerSacCroquettes(); } public void afficher(){ sopln(''Je suis un chat''); } } ● Valide, pouvant être instanciée

3. Héritage ● Motivation ● Définition ● Surcharge et héritage ● Polymorphisme de classe ● Classe abstraite ● Héritage multiple ● Règles de visibilité

i IEM / uB GFDL Héritage multiple ● Modéliser ceci : Camping car VéhiculeHabitation

i IEM / uB GFDL Héritage multiple ● Nombreuses difficultés : – Ambiguité de nommage (attributs ayant même nom dans les 2 classes mères) – Plusieurs constructeurs parents : appel dans quel ordre ? ● Disponible en C++ ● Java : non ● Forme limitée avec les interfaces (pas au programme)

3. Héritage ● Motivation ● Définition ● Surcharge et héritage ● Polymorphisme de classe ● Classe abstraite ● Héritage multiple ● Règles de visibilité

i IEM / uB GFDL Règles de visibilité ● Membre public : accessible depuis n'importe quelle classe ● Membre private : accessible uniquement depuis la classe de définition ● (Membre protected : accessible depuis les classes héritières)