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) 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
Principe d’’hé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 …
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.
Qu’est-ce que les sous-classes ont en commun ? 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.
Principe d’héritage Exemple : Caractéristiques des Animaux : Nom (ex: lion, chat, chien,...) Poids Taille Date de naissance Caractéristiques des AnimauxMarins : Nom Nombre de branchies Caractéristiques des Pieuvre : Nombre de tentacules
Java, deux sortes d’hé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
Héritage à partir de classe
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.
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.
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).
Modificateurs d’accès et sous classes
Modificateurs d’accès et sous classes Il existe trois modificateurs d’accès pour les membres d’une classe Public Private Protected Toutes les sous-classes et les objets peuvent accéder directement aux membres public
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).
Modificateurs d’accès et sous classes Exemple 1: public class Classe1{ public int x; private int y; protected int z; } Objet Classe1 objet = new Classe1(); objet.x = 0; objet.y = 0; objet.z = 0; légal illégal illégal
Modificateurs d’accès et sous classes Exemple 2: public class Classe1{ public int x; private int y; protected int z; } Sous classes public class Classe2 extends Class1{ private int a = x; private int b = y; private int c = z; légal illégal légal
Constructeur des classes de base
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).
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é.
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.
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.
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++;
Héritage vs composition
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.
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.
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.
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.
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.
Héritage à partir d’interface
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
Héritage à partir d’interface Exemple : public interface Animaux { public String nom = null; public double poids = 0; public double taille = 0; ... public String getNom(); }
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.
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.
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
Généralisation vs spécialisation
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
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) ...
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
Généralisation vs spécialisation
FIN DU COURS