Introduction à l'orienté objet
Définition Le terme orienté objet siginifie que l'on organise le logiciel comme une collection d'objets organisée en graphe. Chaque objet est capable de mémoriser un état via une structure de données et est doué de comportement grâce à ses méthodes.
Objet et classe Objet Possède une identité. Est une entité réelle encore appelée instance. Il occupe de l'espace mémoire pour mémoriser son état. Il consomme des ressources CPU lorsque son comportement est invoqué. Classe Est un modèle utilisé pour créer des objets présentants des caractéristiques communes.
Identité Chaque objet possède une identité propre. L'identité est attachée à l'existence de chaque objet. L'identité est indépendante de l'état des objets. L'identité est fournie par l'environnement d'exécution. OBJET = identité + état + comportement
Identité – égalité (1) public class Personne { private String nom; public Personne() {} public Personne(String nom) { this.setNom(nom); } public void setNom(String nom) { this.nom = nom; } public String getNom() { return nom; } public boolean egalite(Personne personne) { return this.getNom().equals(personne.getNom(); } }
Identité – égalité (2) public class Main { public static void main(String args[ ]) { Personne p1 = new Personne(''Dupont''); Personne p2 = new Personne(''Dupont''); Personne p3 = p1; if(p1 == p2) System.out.println(''identiques''); // faux else System.out.println(''pas identiques''); // vrai if(p1 == p3) System.out.println(''identiques''); // vrai else System.out.println(''pas identiques''); // faux if(p1.egalite(p2)) System.out.println(''égaux''); // vrai else System.out.println(''pas égaux''); // faux }
État et comportement État Tous les objets d'une même classe ont la même structure d'état, de données. La valeur de l'état stockée par les objets dépend de chaque objet. Comportement Tous les objets d'une même classe ont le même comportement.
Classe Une classe est un modèle, un gabarit, un patron, une matrice. Une classe permet la fabrication d'objets. Une classe définit un type d'objet. Elle définit l'état des objets par des attributs. Dans les langages les attributs sont des variables. Elle définit le comportement des objets par des méthodes. Dans les langages les méthodes sont des fonctions.
Exemple de classe en Java public class Client {... private String nom; private String adresse; private int code; private double caMensuels[ ];... public double caTotal() { double total; for (int i = 0; i < caMensuels.length; i++) total += caMensuels[i]; return total; }
Notion de membre Définition Un membre est un élément constitutif d'une classe ou d'un objet. Il est soit un attribut soit une méthode. Types de membre Membre de classe. Membre d'instance ou d'objet.
Types de membre Membre de classe Portée au niveau de la classe. Partagé par tous les objets. Existence indépendante de tout objet. Membre d'instance Portée au niveau de l'objet.
Membre de classe avec Java public class Client { public Client() { nombre++; } private static int nombre; public static void initialiseNombre() {nombre = 0; }... }... // aucun objet client encore créé Client.initialiseNombre(); Client premier = new client();
Désignation des membres Tous les langages à objet permettent de désigner explicitement un membre au sein d'une classe. Par un mot réservé : this, self,... Tous les membres d'une classe sont pointés par ce lien réflexif. Dans le cas de conflit de nom ce lien aide le langage à s'y retrouver.
this en Java public class Client {... private String nom;... public void setNom(String nom) { this.nom = nom; }... } conflit
Visibilité des membres Définition La visibilité définit le niveau de protection des membres de classe et d'instance. Types de visibilité Publique Protégée Privée Paquetage
Déclaration de la visibilité La visibilité se déclare au niveau de la classe. Chaque langage de programmation propose des mots réservés pour définir la visibilité. En général : public, protected, private
La visibilité publique Un membre public est : accessible par toutes les méthodes de sa classe. accessible par toutes les méthodes de toutes les autres classes.
La visibilité protégée Un membre protégé est : accessible par toutes les méthodes de sa classe. accessible par toutes les méthodes des sous- classes de sa classe. accessible par toutes les méthodes des classes du paquetage. inaccessible dans tous les autres cas.
La visibilité privée Un membre privé est : accessible par toutes les méthodes de sa classe. inaccessible dans tous les autres cas.
La visibilité paquetage Paquetage Un paquetage définit un espace de noms. Un paquetage permet de rassembler des classes dans un même ensemble. Un membre à visibilité paquetage est : accessible par toutes les méthodes des classes du paquetage. inaccessible dans tous les autres cas.
Gestion des paquetages En Java: Le mot réservé package suivi d'un nom indique que la classe appartient à celui-ci. Le mot réservé import suivi d'un nom permet aux méthodes de la classe importatrice d'accéder aux membres publics des classes de ce package. En C++: Les mots using namespace et #include
Exemple en Java package modele; import outils.Calculette; public class Voyage {... public float convertirEnDollars() { Calculette calc = new Calculette(); return calc.calculEnDollars(this.prix); }... }
Tableau des visibilités en Java
Déclaration des visibilités En Java public String unMembreD'instanceAttribut. public void unMembreD'instanceMethode (). protected static Object unMembreDeClasse (). private int unMembreD'instanceAttribut. Double unMembreD'instanceAttribut.
Déclaration des visibilités Rappels UML : Diagramme de classe Le signe – pour privé Le signe # pour protégé Le signe + pour public Diagramme de paquetage Le diagramme de paquetage rassemble les classes du même espace de nom.
Diagrammes : rappels UML
Création des objets Par des méthodes spéciales. Appelées constructeurs. Une classe peut en déclarer plusieurs. Le langage en fournit un par défaut. Signature sans type retour et nom de la méthode identique à celui de la classe.
Constructeurs en Java public class Client { public Client() { this.initialisation(); } public Client(int code, String nom, String adresse) { this.initialisation(); this.setCode(code); this.setNom(nom); this.setAdresse(adresse); }... private String nom; private String adresse; private int code; private double caMensuels[ ];... }
Exemple de création d'objet... Client unclient = new Client();... Client unAutreclient = new Client(1515, ''Marignan'', ''PARIS'');...
Communication entre objets Les objets communiquent par message. La communication passe par l'appel de méthodes. Phénomène appelé invocation. Pour communiquer les objets doivent se connaître. Système de nommage propre aux langages.
Invocation en Java... Client unclient = new Client(1515, ''Marignan'', ''PARIS'');... System.out.println(''chiffre d'affaire : '' + unclient.caTotal());...
Navigation entre objets La navigation empreinte les chemins rendus possibles par la connaissance qu'entretiennent les objets entre eux. La navigation respecte le même système de nommage que l'invocation des méthodes.
Modèle de classes public class A { private String nom=''A''; private B monB;. public String methode() { return getB().getC().getNom(); } public B getB() { return monB; } public void setB(B b) { this.monB = b; } public String getNom() { return nom; } } public class B { private String nom=''B''; private C monC; public C getC() { return monC; } public void setC(C c) { this.monC =c; } public String getNom() { return nom; } } public class C { private String nom=''C''; public String getNom() { return nom; } }
Test navigation A unA = new A(); B unB = new B(); C unC = new C(); unA.setB(unB); // préparation navigation entre unA et unB unB.setC(unC); // préparation navigation entre unB et unC... System.out.println(unA.methode()); // affiche C...
Spécialisation des classes Mécanisme permettant de sous-typer une classe, de réutiliser une classe et d'étendre ses caractéristiques en en ajoutant de nouvelles. La classe de base est dite mère, sur-classe ou encore sur-type. La classe qui spécialise une autre est appelée sous-classe, fille, sous-type ou encore dérivée.
Relation de spécialisation La spécialisation répond à la règle du «EST-UN»
Spécialisation en UML
Spécialisation en Java public class Mere { public Mere(String nom) { this.setNom(nom); } public void setNom(String nom) { this.nom = nom; }... private String nom; } public class Fille extends Mere { public Fille(String nom, int age) { super(nom); this.setAge(age); }... public void setAge(int age) { this.age = age; } private int age;... }
Classe abstraite Il est possible d'indiquer au langage qu'une classe ne soit pas instanciable. Intéressant dans le cas d'une sur-classe représentant une entité abstraite. En Java: Le mot réservé abstract permet de préciser qu'une classe est abstraite.
Classe abstraite en Java public abstract class Mere {... } public class Fille extends Mere {... }
Membres abstraits Les membres peuvent eux aussi être abstraits. Méthodes Données Règle : Toute classe qui possède ou hérite d'un membre abstrait est considérée comme abstraite.
Classe abstraite en Java public class Mere { public abstact void methode();... } public class Fille extends Mere {... // non implémentation de methode() } Les deux classes sont considérées comme abstraites
Spécialisation des méthodes Il est possible de réécrire une méthode dans une sous-classe. Mécanisme différent de la surcharge. Override en anglais alors que surcharge se dit overload. La méthode qui spécialise possède une signature identique à celle de base.
Exemple de réécriture en Java public class Mere { public abstact void methode();... } public class Fille extends Mere {... public void methode() { // implémentation; } }
Autre exemple de réécriture public class Salarie { private float salaire; public float getSalaire() { return salaire; }... } public class Cadre extends Salarie {... private float primes;... public float getSalaire() { return salaire + primes; }... }
Spécialisation et mots réservés this et super En Java: Le mot réservé this désigne un membre local de la classe. Le mot réservé super désigne un membre de la sur-classe.
Exemple avec this et super public class Pere { public Pere(int parametre1) { attribut1 = parametre1; } public void identite() { System.out.println(''je suis un A''); } private int attribut1; } public class B extends A { public B(int parametre1, String parametre2) { super(parametre1); attribut2 = parametre2; } public void identiteDuPere() { super.identite(); } public void identite() { System.out.println(''je suis un B''); } public void famille() { super.identite(); this.identite(); } }
Interface et implémentation Une interface est un contrat public auquel s'engagent les classes qui réalisent l'implémentation A la source de méthodes de conception Design by contract Permet d'élever le niveau d'abstraction Isole davantage l'implémentation Pas disponible dans tous les langages Le langage Java permet l'écriture d'interfaces
Implémentation en UML
Implémentation en Java public interface Pensionnaire { public void dormir(); public void manger(); } public abstract class Animal implements Pensionnaire {... } public class Lion extends Animal {...
Bibliographie Conception et Programmation Objet – B. Meyer Design Patterns – Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides.