Programmation Orientée Objet - Chapitre 4: Héritage et Interface

Page 1 sur 37Lecteur de document UniversityLib

Programmation Orientée Objet - Chapitre 4: Héritage et Interface

Programming, Object-Oriented Programming, Inheritance, Interfaces · course

Voir tous les documents en programmation

Programmation Orient´ee Objet

Chapitre 4: H´eritage et Interface

Dr. Mouna Chebbah

Dr. Mouna Chebbah

L2BC

ESEN

Semestre 1, 2020

Chapitre 4 - H´eritage, M. Chebbah

Semestre 1, 2020

1/37

Principe (1/3)

H´eritage

Red´efinition

Surcharge

Classe Abstraite

Interface

D´efinition d’une hi´erarchie de types:

§ T: un super-type. C’est un type qui a un ou plusieurs

sous-types.

§ ST: un sous-type de T.

§ Un super type T peut avoir plusieurs sous-type {ST1, . . . ,

STn}.

§ Un sous-type ST ne peut avoir qu’un seul super-type T.

Chapitre 4 - H´eritage, M. Chebbah

Semestre 1, 2020

2/37

Principe (2/3)

H´eritage

Red´efinition

Surcharge

Classe Abstraite

Interface

Chapitre 4 - H´eritage, M. Chebbah

Semestre 1, 2020

3/37

Principe (3/3)

D’une fa¸con g´en´erale:

H´eritage

Red´efinition

Surcharge

Classe Abstraite

Interface

§ Toute instance d’un sous-type ST poss`ede des propri´et´es, des

variables et des m´ethodes, d´efinies par un super-type T de ST.

§ Toute op´eration definie par T (utilisant ces variables) est

applicable aux instances de ST. Il n’est pas n´ec´essaire de la

d´efinir lorsqu’on d´efinit ST.

§ Les m´ethodes d´efinies par T sont applicables aux instances de

T et de ST. Elles sont polymorphes. ST est un type

polymorphique.

§ Toutes les propri´et´ees de ST d´efinies au niveau de T, sont

dites h´erit´ees par ST.

Chapitre 4 - H´eritage, M. Chebbah

Semestre 1, 2020

4/37

H´eritage

H´eritage

Red´efinition

Surcharge

Classe Abstraite

Interface

La relation “est sous classe de” induit un h´eritage.

Une sous-classe h´erite tous les membres non-priv´es de sa

super-classe.

L’h´eritage facilite la r´eutilisation du code et la gestion de son

´evolution en factorisant les propri´et´es et des op´erations partag´ees

par diff´erents objets.

Chapitre 4 - H´eritage, M. Chebbah

Semestre 1, 2020

5/37

Exemple

H´eritage

Red´efinition

Surcharge

Classe Abstraite

Interface

Chapitre 4 - H´eritage, M. Chebbah

Semestre 1, 2020

6/37

Exemple

public class Forme {

H´eritage

Red´efinition

Surcharge

Classe Abstraite

Interface

private float dim1, dim2; //Longueur et largeur d’une forme

protected float x;

Forme(){ }//Constructeur de la classe Forme

float superficie(){ //calcule la sup´erficie d’une forme

. . . }

. . .

}

public class Carre extends Forme {

. . .

}

La classe carr´e h´erite l’attribut x et aussi les attributs dim1 et

dim2.Les attributs dim1 et dim2 sont priv´es, ils ne peuvent pas

ˆetre directement manipul´e dans la classe carr´e. La classe carr´e

h´erite ´egalement la m´ethode superficie.

Chapitre 4 - H´eritage, M. Chebbah

Semestre 1, 2020

7/37

H´eritage des d´efinitions structurelles

H´eritage

Red´efinition

Surcharge

Classe Abstraite

Interface

Une instance d’une classe poss`ede autant de champs qu’il y a

d’attributs dans sa classe et sa super-classe.

Exemple:

public class Forme {

private float dim1, dim2;

protected float x;

. . .

}

public class Carre extends Forme {

private String couleur;

. . .

}

Une instance de la classe carr´e aura comme champs les valeurs des

attributs x, dim1, dim2 et couleur.

Chapitre 4 - H´eritage, M. Chebbah

Semestre 1, 2020

8/37

Constructeur et h´eritage

H´eritage

Red´efinition

Surcharge

Classe Abstraite

Interface

§ Le constrcuteur de la sous-classe ST initialise les attributs

h´erit´es a travers l’appel du constructeur de la classe mere T.

§ Le constructeur d’une sous-classe ST appelle le constructeur

de la classe m`ere T avec l’instruction super(...).

Exemple:

public class Forme {

private float dim1, dim2;

protected float x;

Forme(float

lar){

dim1=long;

dim2=lar;}

. . . }

long,

float

public class Carre extends Forme

Publicité

{

private String couleur;

Carre(float cote, String c){

super(cote,cote);

couleur=c;}

. . . }

Chapitre 4 - H´eritage, M. Chebbah

Semestre 1, 2020

9/37

H´eritage de m´ethodes

H´eritage

Red´efinition

Surcharge

Classe Abstraite

Interface

§ Toute m´ethode d´efinie sur une super-classe T est applicable

aux instances des sous-classes de ST.

Exemple:

public class Forme {

private float dim1, dim2;

public class Carre extends Forme {

Forme(float long, float

private String couleur;

lar){

dim1=long;

dim1=lar;

}

Carre(float cote, String c){

super(cote,cote);

couleur=c;}

float superficie(){

return (dim1ˆ dim2)}

}

. . .

}

Chapitre 4 - H´eritage, M. Chebbah

Semestre 1, 2020

10/37

Exemple

H´eritage

Red´efinition

Surcharge

Classe Abstraite

Interface

public static void main(String[] args) {

Carre car=new Carre(5,”Rouge” );

System.out.println(“La superficie du carr´e est de

”+car.superficie()); }

}

Chapitre 4 - H´eritage, M. Chebbah

Semestre 1, 2020

11/37

Appel de m´ethodes h´erit´es

dans une sous-classe

H´eritage

Red´efinition

Surcharge

Classe Abstraite

Interface

§ Les attributs h´erit´es qui sont d´eclar´es “public” et “protected”

peuvent ˆetre utilis´es directement dans une classe descendante.

§ Les attributs d´eclar´es priv´es, ne sont pas acc´essible

directement dans les classes descendantes. Il faut, donc,

utiliser les getters et setters de ces attributs h´erit´es.

§ L’appel d’une m´ethode h´erit´ee se fait par l’instruction:

Super.Nomdelamethode (param1, param2, . . . ),

sachant que la m´ethode Nomdelamethode (param1, param2,

. . . ) est d´efinie dans la classe m`ere.

Chapitre 4 - H´eritage, M. Chebbah

Semestre 1, 2020

12/37

Exemple (1/2)

H´eritage

Red´efinition

Surcharge

Classe Abstraite

Interface

public class Forme {

private float dim1, dim2;

Forme(float long, float lar){

dim1=long;

dim2=lar;

}

float superficie(){

return (dim1ˆ dim2)}

float getdim1(){

return (dim1)}

float getdim2(){

return (dim2)}

}

Chapitre 4 - H´eritage, M. Chebbah

Semestre 1, 2020

13/37

Exemple (2/2)

H´eritage

Red´efinition

Surcharge

Classe Abstraite

Interface

public class Carre extends Forme {

private String couleur;

Carre(float cote, String c){

super(cote, cote);

couleur=c;}

void afficherD(){//Affiche les donn´ees d’un carr´e//

System.out.println(“Le carr´e mesure “+super.getdim1()+”” de

couleur “+ couleur+ “et de superficie “+ super.superficie()) }

}

Chapitre 4 - H´eritage, M. Chebbah

Semestre 1, 2020

14/37

La classe Object

H´eritage

Red´efinition

Surcharge

Classe Abstraite

Interface

§ Object est la classe racine. Toutes les classes h´eritent de la

classe Object.

§ Dans la classe Object sont d´efinies les m´ethodes applicables `a

tous les objects. Par exemple:

§ la m´ethode equals qui test d’´egalit´e logique de deux objets,

§ la m´ethode toString fabriquant une chaˆıne de caract`ere

repr´esentative du receveur.

Exemple:

new Point(3, 4). equals ( new Point(3, 4));

´ ą true

new Point(1, 2). toString();

´ ą“1@2”

Chapitre 4 - H´eritage, M. Chebbah

Semestre 1, 2020

15/37

Red´efinition de variables

H´eritage

Red´efinition

Surcharge

Classe Abstraite

Interface

Les sous classes peuvent red´efinir les variables: il suffit de les

re-d´eclarer sous le mˆeme nom avec un type diff´erent

Exemple:

public class Forme {

protected float dim1;

protected float dim2;

protected float x;

. . .

}

public class Carre extends Forme {

Publicité

private int x;

. . .

}

Chapitre 4 - H´eritage, M. Chebbah

Semestre 1, 2020

16/37

Red´efinition de m´ethodes

H´eritage

Red´efinition

Surcharge

Classe Abstraite

Interface

La red´efinition consiste `a red´efinir (reprendre), dans une classe

descendante, une m´ethode d´efinie la classe m`ere. G´en´eralement, la

m´ethode red´efinie est une extension de la m´ethode d´ecrite dans la

classe m`ere.

§ Les sous-classes peuvent red´efinir les m´ethodes h´erit´ees: il

suffit de les r´eecrire avec le mˆeme nom, mˆeme type de retour

et le mˆeme nombre d’arguments ayant les mˆemes types.

§ Un constructeur d’une sous-classe ST qui h´erite de T peut

´etendre le constructeur de T:

§ le constructeur de ST appelle le constructeur de T avec

l’instruction super(...).

§ le conctructeur de ST peut contenir d’autres instructions `a

part l’appel du constructeur de T.

Chapitre 4 - H´eritage, M. Chebbah

Semestre 1, 2020

17/37

Exemple

H´eritage

Red´efinition

Surcharge

Classe Abstraite

Interface

public class Forme {

protected float dim1, dim2;

public class Carre extends Forme {

Forme(float long, float

super(c,c);}

Carre(float c){

lar){

dim1=long;

dim2=lar;}

float superficie(){

return (dim1ˆ dim2)}

. . .

}

float superficie(){

float s=super.superficie();

System.out.println(“La superficie

du carr´e est ”+s);

return (s);}

. . .

}

Chapitre 4 - H´eritage, M. Chebbah

Semestre 1, 2020

18/37

Surcharge de m´ethodes

H´eritage

Red´efinition

Surcharge

Classe Abstraite

Interface

Les sous-classes peuvent surcharger les m´ethodes h´erit´ees.

Exemple

public class Forme {

private float dim1, dim2;

public class Carre extends Forme

{

private float c;

Forme(float long, float

lar){

dim1=long;

dim2=lar;}

Carre(float x){

super(c,c);

c=x;}

float superficie(){

return (dim1ˆ dim2)}

. . .

}

double superficie(){

return (cˆ c);}

. . .

}

Chapitre 4 - H´eritage, M. Chebbah

Semestre 1, 2020

19/37

Exercice (1/4)

H´eritage

Red´efinition

Surcharge

Classe Abstraite

Interface

Ecrire une classe Personne qui permet de g´erer un individu, cette

classe dispose des attributs suivant: nom, pr´enom et ˆage. De plus,

elle a 4 m´ethodes :

1. Un constructeur de la classe Personne.

2. Une m´ethode void afficherInfos() qui affiche les informations

d’une Personne.

3. Une m´ethode int getAge() qui retourne la valeur de l’attribut

age.

4. Une m´ethode void setAge(...) qui modifie la valeur de

l’attribut age.

Chapitre 4 - H´eritage, M. Chebbah

Semestre 1, 2020

20/37

Exercice (2/4)

H´eritage

Red´efinition

Surcharge

Classe Abstraite

Interface

Ecrire une classe Enseignant, sous la classe Personne, cette classe

dispose des attributs suivants: sp´ecialit´e, grade et salaire. De plus,

elle a 2 m´ethodes:

1. Un constructeur de la classe Enseignant appelant le

constructeur de la classe m`ere par super, puis initialisant ses

champs propres.

2. Une m´ethode void afficherInfo() qui red´efinit la m´ethode

afficherInfo() de sa classe m`ere et qui affiche les informations

d’un Enseignant.

Chapitre 4 - H´eritage, M. Chebbah

Semestre 1, 2020

21/37

Exercice (3/4)

H´eritage

Red´efinition

Surcharge

Classe Abstraite

Interface

Ecrire une classe Etudiant, sous la classe Personne, cette classe

dispose des attributs suivant : num´ero ´etudiant, sp´ecialit´e, nombre

de matieres, les notes des quatre matieres ´etudi´ees au cours de

l’ann´ee et leurs coefficients et l’ann´ee en cours (une variable de

classe). De plus, elle a 4 m´ethodes:

1. Un constructeur de la classe Entudiant appelant le

constructeur de la classe m`ere par super, puis initialisant ses

champs propres.

2. Une m´ethode void ajouterCours(...) qui permet d’ajouter une

mati`ere, son coefficient et la note correspondante.

3. Une m´ethode void afficherCours() qui permet d’afficher une

mati`ere, son coefficient et la note correspondante.

4. Une m´ethode Double moyenneE() qui permet de calculer la

moyenne d’un ´etudiant pendant l’ann´ee en cours.

Chapitre 4 - H´eritage, M. Chebbah

Semestre 1, 2020

22/37

Publicité

Exercice (4/4)

H´eritage

Red´efinition

Surcharge

Classe Abstraite

Interface

Ecrire une classe Test qui contient la fonction main() et qui

permet de tester votre programme:

/ Test de la classe Enseignant */

1. Cr´eer une instance de la classe Enseignant.

2. Afficher les informations de cet enseignant.

3. Modifier le salaire de cet enseignant.

4. Modifier l’ˆage de cet enseignant.

5. Afficher les informations de l’enseignant avec les mises `a jour.

/ Test de la classe Etudiant ** /

6. Cr´eer une instance de la classe Etudiant.

7. Afficher les informations de cet ´etudiant.

8. Ajouter les 4 mati`eres ´etudi´ees au cours de l’ann´ee, ainsi que les

coefficients et les notes.

9. Afficher les notes de l’´etudiant d´ej`a cr´ee.

10. Calculer moyenne de l’´etudiant et afficher s’il a r´eussi l’ann´ee

ou pas.

23/37

Chapitre 4 - H´eritage, M. Chebbah

Semestre 1, 2020

D´efinition

H´eritage

Red´efinition

Surcharge

Classe Abstraite

Interface

§ Une classe abstraite est une classe incompl`ete. Elle regroupe

un ensemble d’attributs et de m´ethodes mais certaines de ses

m´ethodes ne contiennent pas d’instructions, elles devront ˆetre

d´efinies dans une classe h´eritant de cette classe abstraite.

§ Une classe abstraite est une classe qui ne permet pas

d’instancier des objets, elle ne peut servir que de classe de

base pour une d´erivation.

Chapitre 4 - H´eritage, M. Chebbah

Semestre 1, 2020

24/37

M´ethode abstraite

H´eritage

Red´efinition

Surcharge

Classe Abstraite

Interface

§ Une m´ethode abstraite est une m´ethode non impl´ement´ee

§ Uniquement la signature de la m´ethode abstraite est fournie

(le Nom, les param`etres et le type de retour de la m´ethode)

Exemple

public abstract class Forme{

private float dim1, dim2;

public Forme(float L, float l){

dim1 = L;

dim1 = l;

}

public abstract float Superficie();

}

Chapitre 4 - H´eritage, M. Chebbah

Semestre 1, 2020

25/37

M´ethode abstraite

H´eritage

Red´efinition

Surcharge

Classe Abstraite

Interface

§ Une m´ethode abstraite doit ˆetre obligatoirement d´eclar´ee

‘’public”, ce qui est logique puisque sa vocation est d’ˆetre

red´efinie dans une classe d´eriv´ee

§ D`es qu’une classe contient une ou plusieurs m´ethodes

abstraites, elle est abstraite

§ Les noms d’arguments muets doivent figurer dans la d´efinition

d’une m´ethode abstraite.

Exemple:

public abstract void methode(int); //Erreur : nom argument fictif

est obligatoire

public abstract void methode(int x); int x est un argument muet

Chapitre 4 - H´eritage, M. Chebbah

Semestre 1, 2020

26/37

M´ethode abstraite

H´eritage

Red´efinition

Surcharge

Classe Abstraite

Interface

§ Une classe d´eriv´ee d’une classe abstraite n’est pas oblig´ee de

red´efinir toutes les m´ethodes abstraites

§ Elle peut ne red´efinir aucune, mais elle reste abstraite tant

qu’il y a encore des m´ethodes abstraites non impl´ement´ees

§ Une classe d´eriv´ee d’une classe non abstraite peut ˆetre

d´eclar´ee abstraite

Chapitre 4 - H´eritage, M. Chebbah

Semestre 1, 2020

27/37

Exemple: red´efinition des m´ethodes

abstraites

H´eritage

Red´efinition

Surcharge

Classe Abstraite

Interface

public class Cercle extends Forme{

public Cercle(float rayon) {

super(rayon,2*rayon);}

public float superficie () {

return (rayonrayon3.14); }

}

public class Forme{

float dim1, dim2;

public Forme(float d1,float d2) {

dim1=d1;

dim2=d2;}

public static float superficie();}

Chapitre 4 - H´eritage, M. Chebbah

Semestre 1, 2020

28/37

Classe abstraite

H´eritage

Red´efinition

Surcharge

Classe Abstraite

Interface

§ Une classe abstraite peut contenir des m´ethodes non

abstraites et des d´eclarations d’attributs.

§ Une classe abstraite est incompl`ete: elle est donc non

instanciable et doit ˆetre h´erit´ee =ą on ne peut pas utiliser les

constructeurs d’une classe abstraite et donc on ne peut pas

cr´eer d’objet de cette classe.

§ Une classe est automatiquement abstraite si une de ses

m´ethodes est abstraite.

§ Une classe qui h´erite d’une classe abstraite ne devient

concr`ete que si elle impl´emente toutes les m´ethodes abstraites

de la classe dont elle h´erite.

§ Une classe abstraite peut ˆetre d´eriv´ee en une sous-classe:

§ Abstraite si une ou plusieurs m´ethodes ne sont pas

impl´ement´ees par la classe fille,

§ Non abstraite si toutes les m´ethodes abstraites sont

impl´ement´ees dans la classe fille.

Chapitre 4 - H´eritage, M. Chebbah

Semestre 1, 2020

29/37

Int´erˆet

H´eritage

Red´efinition

Surcharge

Publicité

Classe Abstraite

Interface

Le recours aux classes abstraites facilite la conception orient´ee

objet. On peut placer dans une classe abstraite toutes les

fonctionnalit´es dont on souhaite disposer pour les classes

descendantes :

§ Soit sous la forme d’une impl´ementation compl`ete de

m´ethodes (non abstraites) et de champs (priv´es ou non)

lorsqu’ils sont communs `a tous les descendants,

§ Soit sous forme d’interface de m´ethodes abstraites dont on est

alors sˆur qu’elles existeront dans toute classe d´eriv´ee

instanciable.

Chapitre 4 - H´eritage, M. Chebbah

Semestre 1, 2020

30/37

D´efinition

H´eritage

Red´efinition

Surcharge

Classe Abstraite

Interface

Interface: une collection de d´eclaration de m´ethodes abstraites et

de variables de classes.

§ Une interface est un type, au mˆeme titre qu’une classe, mais

abstrait et qui donc ne peut ˆetre instanci´e (par appel `a new

plus constructeur).

§ Une interface d´ecrit un ensemble de signatures de m´ethodes,

sans impl´ementation, qui doivent ˆetre impl´ement´ees dans

toutes les classes qui impl´ementent l’interface.

Chapitre 4 - H´eritage, M. Chebbah

Semestre 1, 2020

31/37

Utilit´e

H´eritage

Red´efinition

Surcharge

Classe Abstraite

Interface

L’utilit´e du concept d’interface r´eside dans le regroupement de

plusieurs classes, tel que chacune impl´emente un ensemble

commun de m´ethodes, sous un mˆeme type. Une interface:

§ contient des signatures de m´ethodes;

§ ne peut pas contenir de variables: les variables d´eclar´ees dans

une interfaces sont toutes statiques et finales.;

§ peut h´eriter d’une autre interface (avec le mot-cl´e extends);

§ Les classes impl´ementant une interface doivent d´efinir toutes

les m´ethodes de l’interface ou doivent ˆetre d´eclar´ees

abstraites.

§ une classe (abstraite ou non) peut impl´ementer plusieurs

interfaces. La liste des interfaces impl´ement´ees doit alors

figurer apr`es le mot-cl´e implements plac´e dans la d´eclaration

de classe, en s´eparant chaque interface par une virgule.

Chapitre 4 - H´eritage, M. Chebbah

Semestre 1, 2020

32/37

Exemple (1/5)

H´eritage

Red´efinition

Surcharge

Classe Abstraite

Interface

La classe Forme peut ˆetre une interface d´ecrivant les m´ethodes qui

doivent ˆetre impl´ement´ees par les classes Rectangle et Cercle, ainsi

que par la classe Carre (mˆeme si celle-ci peut profiter de son

h´eritage de Rectangle). L’interface Forme s’´ecrit alors de la

mani`ere suivante:

public interface Forme {

public double surface();

public void affiche();

}

Chapitre 4 - H´eritage, M. Chebbah

Semestre 1, 2020

33/37

Exemple (2/5)

H´eritage

Red´efinition

Surcharge

Classe Abstraite

Interface

public class Cercle implements Forme {

float rayon;

Cercle(float x){

rayon=x;}

double surface(){

return (3.14rayonrayon);}

public void affiche(){

System.out.println(“le cercle est de rayon ”+rayon+” et de

surface ”+surface());}

}

Chapitre 4 - H´eritage, M. Chebbah

Semestre 1, 2020

34/37

Exemple (3/5)

H´eritage

Red´efinition

Surcharge

Classe Abstraite

Interface

public class Rectangle implements Forme {

float Long, lar;

Ractangle(float x; float y){

Long=x;

lar=y;}

public double surface(){

return Longˆlar;}

public void affiche(){

System.out.println(“le rectangle est de dimension

”+Long+”/”+lar+” et de surface ”+surface());} }

Chapitre 4 - H´eritage, M. Chebbah

Semestre 1, 2020

35/37

Exemple (4/5)

H´eritage

Red´efinition

Surcharge

Classe Abstraite

Interface

public class Carre extends Rectangle implements Forme {

Carre(float x){

super(x,x);}

public void affiche(){

System.out.println(“le carre qui mesure ”+Long+” est de

surface ”+surface());}

}

Chapitre 4 - H´eritage, M. Chebbah

Semestre 1, 2020

36/37

Exemple (5/5)

H´eritage

Red´efinition

Surcharge

Classe Abstraite

Interface

public class TestForme {

public static void main(String[] args) {

Carre c=new Carre(5);

Rectangle r=new Rectangle(4,3);

Cercle cer=new Cercle(5);

c.affiche();

r.affiche();

cer.affiche();

}

}

Chapitre 4 - H´eritage, M. Chebbah

Semestre 1, 2020

37/37