PARADIGME ORIENTÉ OBJET - PART 2 A programming paradigm that uses objects to design systems. Sébastien Adam Les concepts avancés de la programmation orientée-objet
2 Plan Héritage en Java Modificateur d accès Constructeur parent Classe abstraite, interface et type interface Redéfinition de méthode Polymorphisme
3 Héritage : le principe L héritage met en œuvre la généralisation / spécialisation. Généralisation : les éléments communs sont définis dans une superclasse. Spécialisation : les éléments spécifiques sont définis dans une sous-classe. Pour une superclasse (parent) générale, il peut exister plusieurs sous-classes (enfants) plus spécifiques. Parent : Animal Enfant : AnimalMarin Petits enfants : Requin, Poisson, Pieuvre
4 Héritage : le mot réservé extends L héritage est un concept essentiel en Java. Toute classe hérite de la classe Object. Une classe peut hériter d une seule classe à l aide du mot réservé extends. public class Animal { // éléments communs public class AnimalMarin extends Animal { // éléments spécifiques
5 Héritage : le contenu hérité Une classe enfant hérite des déclarations et des définitions de la classe parent (méthodes et attributs). Qu est-ce que les sous-classes ont en commun? Les caractéristiques de la classe parent. Qu est-ce que les sous-classes ont de différent? Leurs caractéristiques spécifiques qui les distinguent.
6 Héritage : un exemple Pieuvre est un animal marin est un animal. Caractéristiques d un animal : Nom Poids Taille Date de naissance Caractéristiques d un animal marin : Nom Poids Taille Date de naissance Nombre de branchies Caractéristiques d une pieuvre : Nom Poids Taille Date de naissance Nombre de branchies Nombre de tentacules
7 Héritage : les modificateurs d accès Trois modificateurs d accès permettent de définir la visibilité des membres d une classe en Java. private : les membres sont accessibles à l intérieur de leur classe seulement. protected : private + les membres sont accessibles par les enfants. public : les membres sont accessibles partout. Un membre déclaré sans modificateur d accès a une visibilité package. package : les membres sont accessibles à l intérieur de leur package seulement. L enfant n a pas accès à tout l héritage, ce qui est privé au parent n est pas accessible.
8 Héritage : un exemple public class Classe1 { public int x; private int y; protected int z; public class Classe2 { Classe1 objet = new Classe1(); objet.x = 0; // ok objet.y = 0; // non objet.z = 0; // non public class Classe1 { public int x; private int y; protected int z; public class Classe2 extends Classe1 { private int a = x; // ok private int b = y; // non private int c = z; // ok
9 Héritage (est un) vs Composition (a un) L héritage est utilisé si la hiérarchie de parents est stable. public class Classe2 extends Classe1 { La composition est préférable si un parent est appelé à changer. public class Classe2 { Classe1 objet = new Classe1();
10 Constructeur parent Un enfant pour appeler un constructeur de la classe parent à l aide du mot réservé super. À défaut d utiliser explicitement un constructeur de la classe de parent, c est celui par défaut qui est toujours appelé. Si le mot réservé super() est utilisé, il doit être la première instruction dans un constructeur enfant. public class Classe1 { private int x; public void setx(int x) { this.x = x; // Le constructeur de Classe2 appelle le constructeur du parent Classe1. public class Classe2 extends Classe1 { private int y; public Classe2(int y) { this.y = y; // Classe3 ne compile pas car il n existe pas de constructeur par défaut dans Classe2. public class Classe3 extends Classe2 { private int z; public Classe3() { this.z = 0; // Classe4 compile correctement car son constructeur appelle dès le début du corps le constructeur du parent. public class Classe4 extends Classe2 { public Classe4() { super(z);
11 Classe abstraite Une classe abstraite généralise un ensemble de classes définit les éléments communs laisse les enfants définir les éléments spécifiques contient une à plusieurs méthodes abstraites Une classe ou une méthode abstraite est déclarée avec le motclé «abstract» en Java public abstract class Document { public String getauteur () { return auteur; // Commun public String gettitre () { return titre; // Commun public abstract String getdescription (); // Spécifique
12 Type Interface Un type interface généralise un ensemble de classes déclare les éléments communs laisse les enfants définir les éléments spécifiques est déclaré avec le mot-clé interface en Java définit des attributs public, static et final en Java ne définit aucune méthode est plus abstrait qu'une classe abstraite Si une classe implémente partiellement un type interface, elle est déclarée abstraite. public interface Document { public String getauteur () ; public String gettitre () ; public String getdescription () ;
13 Héritage : le type interface Une classe peut hériter d un ou plusieurs types interface à l aide du mot réservé implements. public class Classe1 implements Int1, Int2 { Un type interface peut être hériter de plusieurs types interface à l aide du mot réservé extends. public interface Int1 extends Int2, Int3, Int4 {
14 Type abstrait Un type abstrait ne peut pas être instanciée Le type d un objet n est jamais abstrait Document d = new Document ( ); // Invalide : l objet a un type abstrait Le type d une variable peut être abstrait public class Livre extends Document { public String getdescription () { return "Livre : " + gettitre(); Document d = new Livre ( ); // Valide : l objet a un type concret
15 Méthode : signature et redéfinition Une méthode est déclarée par sa signature. Signature = nom + paramètres (type et ordre) Une signature est unique dans une classe Le principe de surcharge (overload) permet à deux méthodes d avoir le même nom à l intérieur d une classe. Le principe de redéfinition (override) permet à une méthode enfant d avoir la même signature qu une méthode parent, sauf le constructeur. Le mot-clé final empêche l'héritage et la redéfinition.
16 Polymorphisme Le principe de substitution stipule qu un enfant peut substituer un parent class Chien extends Animal { // Relation enfant / parent void dresser (Animal a) { // Parent attendu dresser(new Chien()); // Enfant substitue Le polymorphisme est un mécanisme permettant à un même message de déclencher différents comportements selon le type de l'objet qui reçoit le message Animal a; // Variable : Animal a = new Chien(); // Objet : Chien a.parle(); // Le chien aboit a = new Chat(); // Objet : Chat a.parle() // Le chat miaule
17 Polymorphisme Le mot réservé super annule le polymorphisme Dites quel est votre choix d implémentation entre a) et b). public class Employe { double getsalaire() { return salaire; public class Directeur extends Employe { a) double getsalaire() { return ((Employe) this ).getsalaire() + bonus; b) double getsalaire() { return super.getsalaire() + bonus;