41
Introduction au paradigme orienté-objet (suite) Rappel : –Un langage orienté-objet est un langage de programmation qui offre l’encapsulation, l’héritage et le polymorphisme dynamique. –Encapsulation : rendre l’utilisation d’une classe indépendante de son implémentation.

Introduction au paradigme orienté-objet (suite) Rappel : –Un langage orienté-objet est un langage de programmation qui offre lencapsulation, lhéritage

Embed Size (px)

Citation preview

Page 1: Introduction au paradigme orienté-objet (suite) Rappel : –Un langage orienté-objet est un langage de programmation qui offre lencapsulation, lhéritage

Introduction au paradigme orienté-objet (suite)

Rappel :–Un langage orienté-objet est un langage de programmation qui offre l’encapsulation, l’héritage et le polymorphisme dynamique.

–Encapsulation : rendre l’utilisation d’une classe indépendante de son implémentation.

Page 2: Introduction au paradigme orienté-objet (suite) Rappel : –Un langage orienté-objet est un langage de programmation qui offre lencapsulation, lhéritage

Introduction au paradigme orienté-objet (suite)

•Héritage –Classes dérivées

•Classe Object–Interfaces

•Implémentation multiples d’interfaces•Classes abstraites

•Modificateurs d’accès et sous classes –public, protected, private

•Constructeur des classes de base (parent)–Super()

•Héritage (est un) vs composition (a un)–Généralisation ou aggrégation/spécialisation

Page 3: Introduction au paradigme orienté-objet (suite) Rappel : –Un langage orienté-objet est un langage de programmation qui offre lencapsulation, lhéritage

Principe d’’héritage

Page 4: Introduction au paradigme orienté-objet (suite) Rappel : –Un langage orienté-objet est un langage de programmation qui offre lencapsulation, lhéritage

Principe d’héritage

• Une classe décrit une catégorie de données, ses limites et ses différents comportements. C’est un type de données.

• Pour une classe générale, il peut exister plusieurs sous-classes plus spécifiques.

• Exemple : Animaux

AnimauxMarins AnimauxFermes AnimauxDomestiques …

Page 5: Introduction au paradigme orienté-objet (suite) Rappel : –Un langage orienté-objet est un langage de programmation qui offre lencapsulation, lhéritage

Principe d’héritage

• Pour une sous-classe générale il peut exister d’autres sous-classes plus spécifiques.

• Exemple : AnimauxDomestiques

Canin Félin Poisson …

Bref : UNE SOUS-CLASSE EST UNE CLASSE.

Page 6: Introduction au paradigme orienté-objet (suite) Rappel : –Un langage orienté-objet est un langage de programmation qui offre lencapsulation, lhéritage

Principe d’héritage

• Qu’est-ce que les sous-classes ont en commun ?– Les caractéristiques de la classe supérieure

(de base ou parent).

• Qu’est-ce que les sous-classes ont de différent ?– Leurs caractéristiques propres qui les

distinguent.

Page 7: Introduction au paradigme orienté-objet (suite) Rappel : –Un langage orienté-objet est un langage de programmation qui offre lencapsulation, lhéritage

Principe d’héritage

• Exemple :

Caractéristiques des Animaux :– Nom (ex: lion, chat, chien,...)– Poids– Taille– Date de naissance

Caractéristiques des AnimauxMarins :– Nom– Poids– Taille– Date de naissance– Nombre de branchies

Caractéristiques des Pieuvre :– Nom– Poids– Taille– Date de naissance– Nombre de branchies– Nombre de tentacules

Page 8: Introduction au paradigme orienté-objet (suite) Rappel : –Un langage orienté-objet est un langage de programmation qui offre lencapsulation, lhéritage

Principe d’héritage

Programmation

• On dit qu’une sous-classe hérite (elle les a de façon innée) des attributs de sa classe de base (parent) et de ses méthodes.

Java, deux sortes d’héritage– À partir d’une classe– À partir d’une interface

Page 9: Introduction au paradigme orienté-objet (suite) Rappel : –Un langage orienté-objet est un langage de programmation qui offre lencapsulation, lhéritage

Héritage à partir de classe

Page 10: Introduction au paradigme orienté-objet (suite) Rappel : –Un langage orienté-objet est un langage de programmation qui offre lencapsulation, lhéritage

Héritage à partir d’une classe

– On peut hériter d’une seule classe à l’aide du mot réservé extends

Exemple : public class AnimauxMarin extends Animaux{

– Tous les attributs de la classe parent existent pour la sous-classe mais ils ne sont pas accessibles directement s’ils sont déclarés private.

Page 11: Introduction au paradigme orienté-objet (suite) Rappel : –Un langage orienté-objet est un langage de programmation qui offre lencapsulation, lhéritage

Héritage à partir d’une classe

• Toutes les méthodes non privées de la classe parent existent pour la sous-classe.

• On peut ajouter autant d’attributs et de méthodes que l’on veut dans une sous-classe. Ils ne sont pas accessibles par le parent.

Page 12: Introduction au paradigme orienté-objet (suite) Rappel : –Un langage orienté-objet est un langage de programmation qui offre lencapsulation, lhéritage

Héritage à partir d’une classe

• On peut redéfinir tous les membres de la classe parent à l’exception des constructeurs (bien entendu).

• Si on fait référence à un membre qui ne fait pas partie d’une sous-classe, Java ira voir dans les classes parents pour le trouver.

– En Java toutes les classes héritent par défaut de la classe Object.

– Cette classe définit entre autres les méthodes clone(), toString(), equals() et finalize() (voir api).

Page 13: Introduction au paradigme orienté-objet (suite) Rappel : –Un langage orienté-objet est un langage de programmation qui offre lencapsulation, lhéritage

Modificateurs d’accès et

sous classes

Page 14: Introduction au paradigme orienté-objet (suite) Rappel : –Un langage orienté-objet est un langage de programmation qui offre lencapsulation, lhéritage

Modificateurs d’accès et sous classes

• Il existe trois modificateurs d’accès pour les membres d’une classe– Public– Private– Protected

• Public– Toutes les sous-classes et les objets peuvent

accéder directement aux membres public

Page 15: Introduction au paradigme orienté-objet (suite) Rappel : –Un langage orienté-objet est un langage de programmation qui offre lencapsulation, lhéritage

Modificateurs d’accès et sous classes

• Private– Seuls les membres de la classe peuvent

accéder aux membres private, pas même les membres des sous-classes.

• Protected– Seuls les membres de la classe et des sous-

classes peuvent accéder aux membres protected (pas les objets).

Page 16: Introduction au paradigme orienté-objet (suite) Rappel : –Un langage orienté-objet est un langage de programmation qui offre lencapsulation, lhéritage

Modificateurs d’accès et sous classes

Exemple 1:public class Classe1{ public int x; private int y; protected int z;}ObjetClasse1 objet = new Classe1();objet.x = 0; objet.y = 0; objet.z = 0;

légal

illégal

illégal

Page 17: Introduction au paradigme orienté-objet (suite) Rappel : –Un langage orienté-objet est un langage de programmation qui offre lencapsulation, lhéritage

Modificateurs d’accès et sous classes

Exemple 2:public class Classe1{ public int x; private int y; protected int z;}Sous classespublic class Classe2 extends Class1{ private int a = x; private int b = y; private int c = z; }

légal

illégal

légal

Page 18: Introduction au paradigme orienté-objet (suite) Rappel : –Un langage orienté-objet est un langage de programmation qui offre lencapsulation, lhéritage

Constructeur des classes de base

Page 19: Introduction au paradigme orienté-objet (suite) Rappel : –Un langage orienté-objet est un langage de programmation qui offre lencapsulation, lhéritage

Constructeur des classes de base

• Les constructeurs de la classe de base ne peuvent pas être surchargés dans une sous-classe.

• On peut accéder aux membres des classes de bases grâce à une référence qui s’appelle super (même principe que this).

Page 20: Introduction au paradigme orienté-objet (suite) Rappel : –Un langage orienté-objet est un langage de programmation qui offre lencapsulation, lhéritage

Constructeur des classes de base

• Le constructeur par défaut d’une classe de base est super() et doit toujours être utilisé comme première instruction dans une méthode.

• À défaut d’utiliser explicitement un constructeur de la classe de base, c’est celui par défaut qui est toujours appelé.

Page 21: Introduction au paradigme orienté-objet (suite) Rappel : –Un langage orienté-objet est un langage de programmation qui offre lencapsulation, lhéritage

Constructeur des classes de base

Exemple :Public class Classe1{ private int x; public Classe1(int x){ this.x = x; }}

public class Classe2 extends Classe1{ private static int y; public Classe2(){ y++; }}Classe2 ne compile par car il n’existe pas de constructeur par défaut dans Classe1. Java vous oblige à en avoir un lors de l’héritage.

Page 22: Introduction au paradigme orienté-objet (suite) Rappel : –Un langage orienté-objet est un langage de programmation qui offre lencapsulation, lhéritage

Constructeur des classes de base

Exemple :Public class Classe1{ private static int n; private int x; public Classe1(){n++;} public Classe1(int x){ this.x = x; n++; }}

public class Classe2 extends Classe1{ private static int y; public Classe2(){y++;} public Classe2(int x, int y){ this.y = y; y++; }}

L’utilisation d’un constructeur de Classe2 forcera l’appel à super() qui est le constructeur du parent.

Page 23: Introduction au paradigme orienté-objet (suite) Rappel : –Un langage orienté-objet est un langage de programmation qui offre lencapsulation, lhéritage

Constructeur des classes de base

La bonne utilisation du constructeur par copie d’attribut est d’appeler le constructeur de la classe de base explicitement.

Public class Classe1{ private static int n; private int x; public Classe1(){n++; } public Classe1(int x){ this.x = x; n++; }}

public class Classe2 extends Classe1{ private static int y; public Classe2(){y++;} public Classe2(int x, int y){ super(x); this.y = y; y++; }}

Page 24: Introduction au paradigme orienté-objet (suite) Rappel : –Un langage orienté-objet est un langage de programmation qui offre lencapsulation, lhéritage

Héritage vs composition

Page 25: Introduction au paradigme orienté-objet (suite) Rappel : –Un langage orienté-objet est un langage de programmation qui offre lencapsulation, lhéritage

Héritage vs composition

• Pour la conception d’un logiciel, il y a deux approches pour la construction des classes.

• Héritage (est un)

– Une sous-classe qui hérite est un élément de la classe parent.

• Composition*** (a un)

– Une sous classe a un attribut de la classe parent.

***À noter que la composition existe indépendamment de l’héritage.

Page 26: Introduction au paradigme orienté-objet (suite) Rappel : –Un langage orienté-objet est un langage de programmation qui offre lencapsulation, lhéritage

Héritage vs composition

Exemple est un:public class Classe1{ ... int methode1(){} }

public class Classe2 extends Classe1{ ... int methode2(){}}Classe2 objet = new Classe2();Objet.methode1(); //légal

Un objet de la Classe2 peut accéder à la méthode1 car Classe2 est aussi un élément de la Classe1.

Page 27: Introduction au paradigme orienté-objet (suite) Rappel : –Un langage orienté-objet est un langage de programmation qui offre lencapsulation, lhéritage

Héritage vs composition

Exemple a un:public class Classe1{ ... int methode1(){} }

public class Classe2 { private Classe1 objet1; int methode2(){}}Classe2 objet = new Classe2();Objet.methode1(); //illégal

Un objet de la Classe2 ne peut pas accéder à la méthode1 car Classe2 n’est pas un élément de la Classe1.

Page 28: Introduction au paradigme orienté-objet (suite) Rappel : –Un langage orienté-objet est un langage de programmation qui offre lencapsulation, lhéritage

Héritage vs composition

Solution :public class Classe1{ ... int methode1(){} }

public class Classe2 { private Classe1 objet1; ... int methode1(){ return objet1.methode1(); }

int methode2(){}}Classe2 objet = new Classe2();Objet.methode1(); //légal

Un objet de la Classe2 peut maintenant accéder à la méthode1 car Classe2 lui a donné l’accès avec un observateur.

Page 29: Introduction au paradigme orienté-objet (suite) Rappel : –Un langage orienté-objet est un langage de programmation qui offre lencapsulation, lhéritage

Héritage vs composition

• Il est préférable d’utiliser la composition à l’héritage si les caractéristiques et le comportement sont appelés à changer dans l’évolution du logiciel.

– Cela occasionne de la répétition de code mais permet un meilleur contrôle sur la conception de la sous-classe (voir java.util.Stack qui hérite de java.util.Vector).

• On utilisera l’héritage lorsque la hiérarchie est fixe et que les changements sont improbables.

– Gain sur l’écriture de code mais dépendance de la sous-classe sur les modifications à la classe parent.

Page 30: Introduction au paradigme orienté-objet (suite) Rappel : –Un langage orienté-objet est un langage de programmation qui offre lencapsulation, lhéritage

Héritage à partir d’interface

Page 31: Introduction au paradigme orienté-objet (suite) Rappel : –Un langage orienté-objet est un langage de programmation qui offre lencapsulation, lhéritage

Héritage à partir d’interface

2) À partir d’une interface• Une interface est une classe pour laquelle il n’y

a que les attributs et les en-têtes de méthodes.• Les attributs doivent absolument être initialisés

et être public• Le contenu des méthodes est à définir par les

classes qui héritent de l’interface (Pas { }).• On définit une interface à l’aide du mot réservé

interface plutôt que class

Page 32: Introduction au paradigme orienté-objet (suite) Rappel : –Un langage orienté-objet est un langage de programmation qui offre lencapsulation, lhéritage

Héritage à partir d’interface

Exemple : public interface Animaux { public String nom = null; public double poids = 0; public double taille = 0; ...

public String getNom();

}

Page 33: Introduction au paradigme orienté-objet (suite) Rappel : –Un langage orienté-objet est un langage de programmation qui offre lencapsulation, lhéritage

Héritage à partir d’interface

– Une classe peut hériter de plusieurs interfaces à l’aide du mot réservé implements. On parle alors d’héritage multiple d’interfaces.

Exemple : public class Classe1 implements Int1, Int2, ...

– Une classe qui hérite d’une interface et qui n’implémente pas toutes les méthodes devient une classe abstraites.

Page 34: Introduction au paradigme orienté-objet (suite) Rappel : –Un langage orienté-objet est un langage de programmation qui offre lencapsulation, lhéritage

Héritage à partir d’interface

– Une classe abstraite doit commencer avec le mot réservé abstract

Exemple : public abstract classe1 implements Int1

– On ne peut pas instancier un objet d’une classe abstraite.

– On dira qu’une classe est concrète si toutes ses méthodes sont définies.

– Un objet est toujours instancié à partir d’une classe concrète.

Page 35: Introduction au paradigme orienté-objet (suite) Rappel : –Un langage orienté-objet est un langage de programmation qui offre lencapsulation, lhéritage

Héritage à partir d’interface

Exemple :

public interface Int1{

public int x = 0;

public int methode1();

}

public abstract class Classe1 implements Int1{

int y;

}

Classe1 objet = new Classe1(); //erreur classe abstraite

Obligatoire puisque methode1() n’est pas définie

methode1() n’est pas implémentée

Page 36: Introduction au paradigme orienté-objet (suite) Rappel : –Un langage orienté-objet est un langage de programmation qui offre lencapsulation, lhéritage

Généralisation vs spécialisation

Page 37: Introduction au paradigme orienté-objet (suite) Rappel : –Un langage orienté-objet est un langage de programmation qui offre lencapsulation, lhéritage

Généralisation vs spécialisation

• Une sous-classe est une définition plus spécifique que celle de sa classe de base.

• Une classe de base est une définition plus générale que celle de ses sous-classes.

• Lorsqu’on crée des sous-classes on fait de la spécialisation.

• Lorsqu’on trouve une forme générale pour des sous-classes, on dit qu’on fait de la généralisation ou de l’aggrégation

Page 38: Introduction au paradigme orienté-objet (suite) Rappel : –Un langage orienté-objet est un langage de programmation qui offre lencapsulation, lhéritage

Généralisation vs spécialisation

• Spécialisation : On connaît les attributs commun et on définit des attributs spécifiques pour les sous-classes

– StatJoueurs (attribut commun :nombre parties jouées)• StatJoueurBaseball (nombre de buts volé)• StatJoueurHockey(nombre de passes)• StatJoueurBasket(nombre de paniers)• ...

Page 39: Introduction au paradigme orienté-objet (suite) Rappel : –Un langage orienté-objet est un langage de programmation qui offre lencapsulation, lhéritage

Généralisation vs spécialisation

• Généralisation : On connaît les attributs des sous-classes et on regroupe les attributs communs dans une classe de base

Page 40: Introduction au paradigme orienté-objet (suite) Rappel : –Un langage orienté-objet est un langage de programmation qui offre lencapsulation, lhéritage

Animaux

AnimauxDomestiques AnimauxDeFerme ...

Cochons Poules

Couveuses

Pondeuses

Généralisation vs spécialisation

Spécialisation

Généralisation

Page 41: Introduction au paradigme orienté-objet (suite) Rappel : –Un langage orienté-objet est un langage de programmation qui offre lencapsulation, lhéritage

FIN DU COURS