Programmations Orientées Objet - JAVA PDF
Document Details
Uploaded by PleasantIndianapolis2890
Université Cadi Ayyad Marrakech
2020
Laila Amir
Tags
Summary
This document is a set of lecture notes for a programming course (likely Java). It covers object-oriented programming concepts, including delegation and inheritance through examples and diagrams.
Full Transcript
Réutilisation des classes Méthodes et classes abstraites, Interface Programmations Orientées Objet - JAVA Chap 3 : Délégation & héritage Pr. Laila AMIR Licence SIR (Systèmes informatiques Répartis) Année unive...
Réutilisation des classes Méthodes et classes abstraites, Interface Programmations Orientées Objet - JAVA Chap 3 : Délégation & héritage Pr. Laila AMIR Licence SIR (Systèmes informatiques Répartis) Année universitaire 2019/2020 Laila AMIR Programmations Orientées Objet 1 / 30 Réutilisation des classes Méthodes et classes abstraites, Interface Plan 1 Réutilisation des classes Délégation Héritage 2 Méthodes et classes abstraites, Interface Méthodes et classes abstraites Définition d’une interface Déclaration d’une interface Implémentation d’une interface Laila AMIR Programmations Orientées Objet 2 / 30 Réutilisation des classes Délégation Méthodes et classes abstraites, Interface Héritage Plan 1 Réutilisation des classes Délégation Héritage 2 Méthodes et classes abstraites, Interface Méthodes et classes abstraites Définition d’une interface Déclaration d’une interface Implémentation d’une interface Laila AMIR Programmations Orientées Objet 3 / 30 Réutilisation des classes Délégation Méthodes et classes abstraites, Interface Héritage Introduction Dans une conception objet on définit des associations (relations) entre classes pour exprimer la réutilisation. Nous nous focaliserons sur deux formes d’association Un objet peut faire appel à un autre objet : délégation Un objet peut être créé à partir d’un autre objet : héritage Laila AMIR Programmations Orientées Objet 4 / 30 Réutilisation des classes Délégation Méthodes et classes abstraites, Interface Héritage Délégation Un objet o1 instance de la classe C1 utilise les services d’un objet o2 instance de la classe C2 (o1 délègue une partie de son activité à o2). La classe C1 utilise les services de la classe C2 C1 est la classe cliente C2 est la classe serveuse public class C1 { public class C2 { private C2 refc2;...... } } La classe cliente C1 possède une référence de type de la classe serveuse C2. Laila AMIR Programmations Orientées Objet 5 / 30 Réutilisation des classes Délégation Méthodes et classes abstraites, Interface Héritage Délégation : exemple Le point peut être partagé par plusieurs instances d’objets public class Cercle { private Point centre; (éventuellement d’autres classes). private double r; public Cercle(Point centre, double r) { Point p1 = new Point(10,0); this.centre = centre; Cercle c1 = new Cercle(p1,10); this.r = r; Cercle c2 = new Cercle(p1,20); } c2.deplace(10,0); Affecte aussi c1... public void deplace(double dx,double dy) { centre.deplace(dx,dy); } } Après ces opérations le centre des 2 cercles est (20,0). Laila AMIR Programmations Orientées Objet 6 / 30 Réutilisation des classes Délégation Méthodes et classes abstraites, Interface Héritage Délégation : exemple Le Point représentant le centre n’est pas partagé (un Point ne peut être liée qu’à un seul Cercle) public class Cercle { Point p1 = new Point(10,0); private Point centre; Cercle c1 = new Cercle(p1,10); private double r; Cercle c2 = new Cercle(p1,20); public Cercle(Point centre, double r) { c2.deplace(10,0); N’affecte que c2. this.centre = new Point(centre); this.r = r; }... } Laila AMIR Programmations Orientées Objet 7 / 30 Réutilisation des classes Délégation Méthodes et classes abstraites, Interface Héritage Héritage l’héritage permet de reprendre les caractéristiques d’une classe existante (mère) pour les étendre et définir ainsi une nouvelle classe (fille) qui hérite de l’existante. Les objets de la classe fille possèdent toutes les caractéristiques de la classe mère avec en en plus celles propres de la classe fille. La relation d’héritage peut être vue comme une relation de ”généralisation/spécialisation” entre une classe (la super-classe) et plusieurs classes plus spécialisées (ses sous-classes). Laila AMIR Programmations Orientées Objet 8 / 30 Réutilisation des classes Délégation Méthodes et classes abstraites, Interface Héritage Généralisation/Spécialisation La généralisation exprime une relation ”est-un” entre une classe et sa super-classe (chaque instance de la classe est aussi décrite de façon plus générale par la super- classe)=> factorisation les propriétés communes aux sous-classes. La spécialisation exprime une relation de ”particularisation” entre une classe et sa sous-classe (chaque instance de la sous-classe est décrite de manière plus spécifique)=> modification incrémentielle les descriptions existantes. Laila AMIR Programmations Orientées Objet 9 / 30 Réutilisation des classes Délégation Méthodes et classes abstraites, Interface Héritage L’héritage toute classe autre que Object possède une super-classe; toute classe hérite directement ou indirectement de la classe Object; toute classe ne dérivant d’aucune classe hérite implicitement de la classe Object; Java ne supporte que l’héritage simple. Il est impossible de faire dériver une classe de plus d’une autre classe; Les classes C, D, E Le mot clé pour déclarer une classe héritent de la classe B. Et dérivée est extends. B hérite de la classe A1 Laila AMIR Programmations Orientées Objet 10 / 30 Réutilisation des classes Délégation Méthodes et classes abstraites, Interface Héritage Exemple 1 : héritage simple Dans cet exemple, la classe Voiture class Vehicule { hérite de la classe Vehicule, ce qui protected : int age ; veut dire que les attributs age float poids ; et poids, moteur bien qu’étant boolean moteur ; définis dans la classe Vehicule, int getWeight() { return(poids) ;} sont présents dans la classe } Voiture. public class Voiture extends Vehicule { public int places ; public Voiture() { Le constructeur défini dans la classe moteur = true ; Voiture permet d’ailleurs d’initialiser places = 4 ; ces attributs. } } Laila AMIR Programmations Orientées Objet 11 / 30 Réutilisation des classes Délégation Méthodes et classes abstraites, Interface Héritage Réutilisation des constructeurs réutilisation du code des constructeurs de la super classe dans la définition des constructeurs d’une nouvelle classe; invocation d’un constructeur de la super classe : super(paramètres du constructeur); appel à un constructeur de la super classe doit toujours être la première instruction dans le corps du constructeur; si la première instruction d’un constructeur n’est pas un appel explicite à l’un des constructeur de la superclasse, alors JAVA insère implicitement l’appel super(); Laila AMIR Programmations Orientées Objet 12 / 30 Réutilisation des classes Délégation Méthodes et classes abstraites, Interface Héritage Réutilisation des constructeurs public class Point { double x,y; public Point(double x, double y){ // super(); appel implicite du constructeur de la classe Object this.x = x; this.y = y; } } import java.awt.Color; public class PointCouleur extends Point { Color c; public PointCouleur(double x, double y, Color c){ super(x,y); this.c = c; } } Laila AMIR Programmations Orientées Objet 13 / 30 Réutilisation des classes Délégation Méthodes et classes abstraites, Interface Héritage Constructeur par défaut Lorsqu’une classe ne définit pas explicitement de constructeur, elle possède un constructeur par défaut sans paramètres. constructeur par défaut implicite Laila AMIR Programmations Orientées Objet 14 / 30 Réutilisation des classes Délégation Méthodes et classes abstraites, Interface Héritage Constructeur par défaut Le compilaeur génère une erreur : Laila AMIR Programmations Orientées Objet 15 / 30 Réutilisation des classes Délégation Méthodes et classes abstraites, Interface Héritage Redéfinition des méthodes Redéfinition d’une méthode c’est lorsque la classe définit une méthode dont le nom, le type de retour et le type des arguments sont identiques à ceux d’une méthode dont elle hérite; Lorsqu’une méthode redéfinie par une classe est invoquée pour un objet de cette classe, c’est la nouvelle définition et non pas celle de la super-classe qui est invoquée. Laila AMIR Programmations Orientées Objet 16 / 30 Réutilisation des classes Délégation Méthodes et classes abstraites, Interface Héritage Exemple 2 // Animal.java public class Animal { private int poids; public void dormir () { System.out.println (”Méthode dormir de Animal”); } public void jouer () { System.out.println (”Méthode jouer de Animal”);} public void seReproduire () { System.out.println (”Méthode sereproduire de Animal”); } } // Mammifere.java public class Mammifere extends Animal { public void seReproduire () { System.out.println (”Méthode seReproduire de Mammifère”);} } Laila AMIR Programmations Orientées Objet 17 / 30 Réutilisation des classes Délégation Méthodes et classes abstraites, Interface Héritage // Chat.java public class Chat extends Mammifere{ public void jouer () { System.out.println (”Méthode jouer de Chat”);} public void miauler () { System.out.println (”Méthode miauler de Chat”);} } // RunChat.java public class RunChat{ L’exécution de RunChat donnera : public static void main (String []args){ Chat minet = new Chat(); minet.dormir(); Méthode dormir de Animal minet.seReproduire(); Méthode seReproduire de Mammifère minet.jouer(); Méthode jouer de Chat } } Laila AMIR Programmations Orientées Objet 18 / 30 Réutilisation des classes Délégation Méthodes et classes abstraites, Interface Héritage Le mot-clé super Ce mot-clé permet également d’accéder explicitement aux membres de la classe de base, dans le cas, où il existe déjà un membre portant ce nom dans la classe (redéfinition de méthode,...). Exemple : public class Vehicule{ public void rouler(){ position += vitesse; } } public class Avion extends Vehicule { public void rouler(){ if (altitude > 0) System.out.println(”L’avion en vol ne peut rouler”); else super.rouler(); } } Laila AMIR Programmations Orientées Objet 19 / 30 Méthodes et classes abstraites Réutilisation des classes Définition d’une interface Méthodes et classes abstraites, Interface Déclaration d’une interface Implémentation d’une interface Plan 1 Réutilisation des classes Délégation Héritage 2 Méthodes et classes abstraites, Interface Méthodes et classes abstraites Définition d’une interface Déclaration d’une interface Implémentation d’une interface Laila AMIR Programmations Orientées Objet 20 / 30 Méthodes et classes abstraites Réutilisation des classes Définition d’une interface Méthodes et classes abstraites, Interface Déclaration d’une interface Implémentation d’une interface Les méthodes et classes abstraites Une méthode déclarée abstract ne peut être exécutée. En fait, elle n’a pas d’existence réelle. Sa déclaration indique simplement que les classes dérivées doivent la redéfinir. Les méthodes abstract présentent les particularités suivantes : Une classe qui contient une méthode abstract doit être déclarée abstract. Une classe abstract ne peut pas être instanciée. Une classe peut être déclarée abstract, même si elle ne comporte pas de méthodes abstract. Laila AMIR Programmations Orientées Objet 21 / 30 Méthodes et classes abstraites Réutilisation des classes Définition d’une interface Méthodes et classes abstraites, Interface Déclaration d’une interface Implémentation d’une interface Les méthodes et classes abstraites Pour pouvoir être instanciée, une sous-classe d’une classe abstract doit redéfinir toute les méthodes abstract de la classe parente. Si une des méthodes n’est pas redéfinie de façon concrète, la sous-classe est elle-même abstract et doit être déclarée explicitement comme telle. Les méthodes abstract n’ont pas d’implémentation. Leur déclaration doit être suivie d’un point-virgule. Remaque : La notion abstract en Java est proche de la notion virtuelle pure en C++, par défaut toutes les méthodes de Java sont virtuelles alors qu’en C++ les méthodes virtuelles doivent l’être explicitement à l’aide du mot-clé virtual. Laila AMIR Programmations Orientées Objet 22 / 30 Méthodes et classes abstraites Réutilisation des classes Définition d’une interface Méthodes et classes abstraites, Interface Déclaration d’une interface Implémentation d’une interface Les méthodes et classes abstraites La méthode crie() de la classe Animal est déclarée abstract class Animal { abstract, ce qui signifie que // champs le cri d’un animal est une // méthodes notion abstraite. abstract void crie() ; } La méthode ainsi définie indique qu’une sous-classe De cette façon, il n’est plus possible de devra définir la méthode de créer un animal en instanciant la classe façon concrète. Animal. Laila AMIR Programmations Orientées Objet 23 / 30 Méthodes et classes abstraites Réutilisation des classes Définition d’une interface Méthodes et classes abstraites, Interface Déclaration d’une interface Implémentation d’une interface Les méthodes et classes abstraites class Chien extends Animal { class Chat extends Animal { // champs // champs // méthodes // méthodes void crie() { void crie() { System.out.println( System.out.println( ”Haw-Haw”); ”Miaou-Miaou”); } } } } En revanche, grâce à la déclaration de la méthode abstract crie() dans la classe Animal, il est possible de faire crier un animal sans savoir s’il s’agit d’un chien ou d’un chat! Laila AMIR Programmations Orientées Objet 24 / 30 Méthodes et classes abstraites Réutilisation des classes Définition d’une interface Méthodes et classes abstraites, Interface Déclaration d’une interface Implémentation d’une interface Les méthodes et classes abstraites En considérant les instances de Chien ou de Chat comme des instances de la classe parente. Animal animal1 = new Chien() ; Animal animal2 = new Chat() ; animal1.crie() ; animal2.crie() ; Le premier animal crie ”Haw-Haw” ; le second, ”Miaou-Miaou”. Laila AMIR Programmations Orientées Objet 25 / 30 Méthodes et classes abstraites Réutilisation des classes Définition d’une interface Méthodes et classes abstraites, Interface Déclaration d’une interface Implémentation d’une interface Définition d’une interface Une classe peut contenir des méthodes abstract et des méthodes non abstract. Cependant, il existe une catégorie particulière de classes qui ne contient que des méthodes abstract. Il s’agit des interfaces. Les interfaces sont toujours abstract, sans qu’il soit nécessaire de l’indiquer explicitement. De la même façon, il n’est pas nécessaire de déclarer leurs méthodes abstract. Laila AMIR Programmations Orientées Objet 26 / 30 Méthodes et classes abstraites Réutilisation des classes Définition d’une interface Méthodes et classes abstraites, Interface Déclaration d’une interface Implémentation d’une interface Les interfaces Les interfaces obéissent par ailleurs à certaines règles supplémentaires. Elles ne peuvent contenir que des variables static et final. Elles peuvent être étendues comme les autres classes, avec une différence majeure : une interface peut dériver de plusieurs autres interfaces. En revanche, une classe ne peut pas dériver de plusieurs classes (pas d’héritage multiple de classes). Une classe dérive toujours d’une autre classe, et peut dériver, en plus, d’une ou plusieurs interfaces. Laila AMIR Programmations Orientées Objet 27 / 30 Méthodes et classes abstraites Réutilisation des classes Définition d’une interface Méthodes et classes abstraites, Interface Déclaration d’une interface Implémentation d’une interface Déclaration d’une interface La définition d’une interface se présente comme celle d’une classe. On y utilise simplement le mot-clé interface à la place de class : public interface Inter { void f(int n) ; // en-tête d’une méthode f (public abstract facultatifs) void g() ; // en-tête d’une méthode g (public abstract facultatifs) } Une interface peut être dotée des mêmes droits d’accès qu’une classe (public ou droit de paquetage). il n’est pas nécessaire de mentionner les mots-clés public et abstract (on peut quand même le faire). Laila AMIR Programmations Orientées Objet 28 / 30 Méthodes et classes abstraites Réutilisation des classes Définition d’une interface Méthodes et classes abstraites, Interface Déclaration d’une interface Implémentation d’une interface Implémentation d’une interface Lorsqu’on définit une classe, on peut préciser qu’elle implémente une interface donnée en utilisant le mot-clé implements, comme dans : class A implements Inter { // A doit (re)définir les méthodes f et g prévues dans l’interface Inter } Ici, on indique que A doit définir les méthodes prévues dans l’interface Inter, c’est-à-dire f et g. Si cela n’est pas le cas, on obtiendra une erreur de compilation. Laila AMIR Programmations Orientées Objet 29 / 30 Méthodes et classes abstraites Réutilisation des classes Définition d’une interface Méthodes et classes abstraites, Interface Déclaration d’une interface Implémentation d’une interface Implémentation d’une interface Une même classe peut implémenter plusieurs interfaces : public interface Inter1 { void f() ; } public interface Inter2 { int h() ; } class A implements Inter1, Inter2 { // A doit obligatoirement définir les méthodes f et h prévues dans Inter1 et Inter2 } Laila AMIR Programmations Orientées Objet 30 / 30