• Aucun résultat trouvé

2I002 HÉRITAGE: LES CLASSES ABSTRAITES

N/A
N/A
Protected

Academic year: 2022

Partager "2I002 HÉRITAGE: LES CLASSES ABSTRAITES"

Copied!
24
0
0

Texte intégral

(1)

2I002

HÉRITAGE:

LES CLASSES ABSTRAITES

Vincent Guigue

Le cours est inspiré de sources diverses: L. Denoyer, F. Peschan- ski,...

(2)

Nouveaux concepts

Classe abstraite Non implémentable

Seules les classes filles seront implémentables Ex: Animal (ABS)Poule, Renard, ...

Fonction abstraite

Seulement dans les classes abstraites Contient une signature mais pas de code Ex: dans Animal,String getEspece()

(3)

Classe abstraite Définition

Représente un objet quine peut pas être instancié

Un concept unificateur qui permet de factoriser du codepour toutes les classes qui hériteront

Introduction de la notion de contrat: toutes les classes filles devront gérer ce qui est décidé par la classe mère (signature de méthode abstraite)

1 p u b l i c a b s t r a c t c l a s s F i g u r e {

2 . . .

3 // s i g n a t u r e s e u l e m e n t p o u r l e s m e t h o d e s a b s t r a i t e s

4 p u b l i c a b s t r a c t S t r i n g g e t T y p e ( ) ;

5 }

On ne peut pas créer d’instance Figure

Des classes vont hériter de Figure, ellesdevront implémenter public abstract String getType();

(4)

Propriétés des classes abstraites

Les classes abstraitespeuvent avoir des attributs

Ex: une figure géométrique (abstraite), peut être localisée par des coordonnées

Les classes abstraitespeuvent avoir des méthodes Ex: la méthode déplacer peut changer les coordonnées précédentes

Les classes abstraitespeuvent avoir des méthodes abstraites i.e. : des méthodes dont on donne seulement la signature.

Elles seront forcément implémentées pour les classes concrètes qui héritent.

Ex: String getType()

Idées

Les classes abstraites sont pensées pour leurs descendantes, les classes filles qui en seront dérivées

(5)

(Retour) sur les bonnes pratiques

Développement à long terme

modification d’un projet existant = ajout d’une classe Idée:

Structurer un projet avec des classes abstraites =

les classes filles possèdent des fonctionnalités dès leur création factorisation du code

Ajout de contraintessur les classes fille

Plus facileà développer ( classe fille = canevas à remplir) Contratsur les fonctionnalités (garanties)

Garanties sur desclasses qui n’existent pas encore: facilités d’évolution du code

Usage du polymorphisme

Tableau hétérogène+ de possibilités

(6)

Etude de cas

On souhaite réaliser un logiciel de géométrie permettant de construire et manipuler des figures géométriques. Il faudra pouvoir intégrer différents types de figures:

Figures simples: Point, Segment, Droite

Polygones: Triangle, Carré, Losange, Rectangle, Parallélépipède

Courbes: Béziers, Lignes brisées, Cercles, Ellipses

et le logiciel pourra être étendu pour en ajouter de nouvelles figures.

Nous souhaitons pouvoir transformer les figures: translater, mettre à l’échelle, calculer des distances et des surfaces (figures fermées), et bien sûr afficher les figures.

(7)

Etude de cas: Identification des concepts/classes

On souhaite réaliser un logiciel de géométrie permettant de construire et manipuler desfigures géométriques. Il faudra pouvoir intégrer différents types de figures:

Figures simples: Point,Segment,Droite

Polygones: Triangle,Carré,Losange,Rectangle, Parallélépipède

Courbes: Béziers,Lignes brisées,Cercles,Ellipses

et le logiciel pourra être étendu pour en ajouter de nouvelles figures.

Nous souhaitons pouvoir transformer les figures: translater, mettre à l’échelle, calculer des distances et des surfaces (figures fermées), et bien sûr afficher les figures.

(8)

Etude de cas: Identification des concepts/classes concrètes Classes concrètes

Les classes concrètes sont les classes que l’on souhaitera effectivementconstruire en mémoire

On souhaite réaliser un logiciel de géométrie permettant de construire et manipuler desfigures géométriques. Il faudra pouvoir intégrer différents types de figures:

Figures simples: Point,Segment,Droite Polygones: Triangle,Carré,Losange,Rectangle, Parallélépipède

Courbes: Béziers,Lignes brisées,Cercles,Ellipses

et le logiciel pourra être étendu pour en ajouter de nouvelles figures.

Nous souhaitons pouvoir transformer les figures: translater, mettre à l’échelle, calculer des distances et des surfaces (figures fermées), et bien sûr afficher les figures.

(9)

Etude de cas: Identification des concepts/classes concrètes Classes abstraites

Les classes concrètes sont les classes que l’on souhaitera ne pas construire en mémoire

On souhaite réaliser un logiciel de géométrie permettant de construire et manipuler desfigures géométriques. Il faudra pouvoir intégrer différents types de figures:

Figures simples: Point,Segment,Droite

Polygones: Triangle,Carré,Losange,Rectangle, Parallélépipède

Courbes: Béziers,Lignes brisées,Cercles,Ellipses

et le logiciel pourra être étendu pour en ajouter de nouvelles figures.

Nous souhaitons pouvoir transformer les figures: translater, mettre à l’échelle, calculer des distances et des surfaces (figures fermées), et bien sûr afficher les figures.

(10)

Identification des traitements

On souhaite réaliser un logiciel de géométrie permettant de construire et manipuler desfigures géométriques. Il faudra pouvoir intégrer différents types de figures:

Figures simples: Point,Segment,Droite

Polygones: Triangle,Carré,Losange,Rectangle, Parallélépipède

Courbes: Béziers,Lignes brisées,Cercles,Ellipses

et le logiciel pourra être étendu pour en ajouter de nouvelles figures.

Nous souhaitons pouvoir transformer les figures: translater, mettre à l’échelle, calculer des distances et des surfaces(figures fermées), et bien sûrafficher les figures.

(11)

Résultat: modèle objet

Concepts abstraits : Classes abstraites + héritage éventuel Figure, Polygone hérite de Figure, Courbe hérite de Figure Concepts concrets : Classes concrètes + héritage

Point hérite de Figure (idem Segment, Droite, LigneBrisee) Triangle hérite de Polygone (idem Carre, Rectangle, etc.) etc. (exercice)

Traitements = Méthodes (privilégier les classes mères) afficher et translater dans Figure

calculer la distance dans Point calculer la longueur dans Segment

mettre à l’échelle, calculer la surface dans Polygone

(12)

Résultat: modèle objet

(13)

Code Java: Classe mère Figure

1 p u b l i c a b s t r a c t c l a s s F i g u r e {

2 p r i v a t e S t r i n g nom ; // ( 1 ) a t t r i b u t s

3 // ( 2 ) C o n s t r u c t e u r p r o t e g e ( p a s d ’ i n s t a n c e s )

4 p r o t e c t e d F i g u r e ( S t r i n g nom ) {

5 t h i s. nom = nom ;

6 }

7 p u b l i c S t r i n g getNom ( ) { // ( 3 ) methode c o n c r e t e

8 r e t u r n x ;

9 }

10 p u b l i c S t r i n g t o S t r i n g ( ) {

11 r e t u r n nom+" : ␣ ";

12 }

13 // ( 4 ) m e t h o d e s a b s t r a i t e s

14 // ( i m p l e m e n t a t i o n d a n s l e s s o u s−c l a s s e s )

15 p u b l i c a b s t r a c t v o i d t r a n s l a t e r (d o u b l e t x , d o u b l e t y ) ;

16 }

(14)

Contenu d’une classe abstraite

Attributs privés (comme d’habitude) Constructeurs protégés

on ne peut pas construire d’instance mais il faut pouvoir initialiser les attributs depuis une sous-classe

Méthodes implémentées

publiques: invocables depuis l’extérieure (vision client) protégées: invocables dans les sous-classes (vision héritier) privées: invocables dans la classe uniquement (vision fournisseur)

Méthodes abstraites publiques ou protégées

pas d’implémentation (ex. calculer la surface d’une figure)

(15)

Contrat minimal de l’héritier

Si une classe B hérite d’une classe A il fautimpérativement:

implémenter des constructeurs pour la sous-classe B première instruction du constructeur: appel à un constructeur de A via super

Il faut construire la partie de B « qui est un » A (+ pas d’accès aux attributs privés de A)

Exemple: dans Point(x,y) appel de super(nom) vers Figure

implémenter toutes les méthodes abstraites de la classe mère A

exemple: Point hérite de figure et doit donc implémenter translater

cas particulier: si B est également abstraite

(16)

Usages croisés, polymorphisme Classe abstraiteFigure

Constructeur sans argument

méthode abstraitevoid translater (Point p) méthode abstraiteString getType ()

ClassePoint extends Figure

Est-ce possible de faire un usage croisé des classes?

Que doit-on faire dans Point? Que penser des lignes suivantes:

1 F i g u r e f ;

OK

2 f = new F i g u r e ( ) ; KO

3 F i g u r e f 2 = new P o i n t ( 1 , 2 ) ; OK

4 P o i n t p = new P o i n t ( 2 , 3 ) ; OK

5 p . t r a n s l a t e r (new P o i n t ( 1 , 1 ) ) ; OK

6 f 2 . t r a n s l a t e r ( p ) ; OK

7 p . t r a n s l a t e r ( f 2 ) ; KO

(17)

Usages croisés, polymorphisme Classe abstraiteFigure

Constructeur sans argument

méthode abstraitevoid translater (Point p) méthode abstraiteString getType ()

ClassePoint extends Figure

Est-ce possible de faire un usage croisé des classes?

Que doit-on faire dans Point? Que penser des lignes suivantes:

1 F i g u r e f ; OK

2 f = new F i g u r e ( ) ;

KO

3 F i g u r e f 2 = new P o i n t ( 1 , 2 ) ; OK

4 P o i n t p = new P o i n t ( 2 , 3 ) ; OK

5 p . t r a n s l a t e r (new P o i n t ( 1 , 1 ) ) ; OK

6 f 2 . t r a n s l a t e r ( p ) ; OK

7 p . t r a n s l a t e r ( f 2 ) ; KO

(18)

Usages croisés, polymorphisme Classe abstraiteFigure

Constructeur sans argument

méthode abstraitevoid translater (Point p) méthode abstraiteString getType ()

ClassePoint extends Figure

Est-ce possible de faire un usage croisé des classes?

Que doit-on faire dans Point? Que penser des lignes suivantes:

1 F i g u r e f ; OK

2 f = new F i g u r e ( ) ; KO

3 F i g u r e f 2 = new P o i n t ( 1 , 2 ) ;

OK

4 P o i n t p = new P o i n t ( 2 , 3 ) ; OK

5 p . t r a n s l a t e r (new P o i n t ( 1 , 1 ) ) ; OK

6 f 2 . t r a n s l a t e r ( p ) ; OK

7 p . t r a n s l a t e r ( f 2 ) ; KO

(19)

Usages croisés, polymorphisme Classe abstraiteFigure

Constructeur sans argument

méthode abstraitevoid translater (Point p) méthode abstraiteString getType ()

ClassePoint extends Figure

Est-ce possible de faire un usage croisé des classes?

Que doit-on faire dans Point? Que penser des lignes suivantes:

1 F i g u r e f ; OK

2 f = new F i g u r e ( ) ; KO

3 F i g u r e f 2 = new P o i n t ( 1 , 2 ) ; OK

4 P o i n t p = new P o i n t ( 2 , 3 ) ; OK

5 p . t r a n s l a t e r (new P o i n t ( 1 , 1 ) ) ;

OK

6 f 2 . t r a n s l a t e r ( p ) ; OK

7 p . t r a n s l a t e r ( f 2 ) ; KO

(20)

Usages croisés, polymorphisme Classe abstraiteFigure

Constructeur sans argument

méthode abstraitevoid translater (Point p) méthode abstraiteString getType ()

ClassePoint extends Figure

Est-ce possible de faire un usage croisé des classes?

Que doit-on faire dans Point? Que penser des lignes suivantes:

1 F i g u r e f ; OK

2 f = new F i g u r e ( ) ; KO

3 F i g u r e f 2 = new P o i n t ( 1 , 2 ) ; OK

4 P o i n t p = new P o i n t ( 2 , 3 ) ; OK

5 p . t r a n s l a t e r (new P o i n t ( 1 , 1 ) ) ; OK

6 f 2 . t r a n s l a t e r ( p ) ;

OK

7 p . t r a n s l a t e r ( f 2 ) ; KO

(21)

Usages croisés, polymorphisme Classe abstraiteFigure

Constructeur sans argument

méthode abstraitevoid translater (Point p) méthode abstraiteString getType ()

ClassePoint extends Figure

Est-ce possible de faire un usage croisé des classes?

Que doit-on faire dans Point? Que penser des lignes suivantes:

1 F i g u r e f ; OK

2 f = new F i g u r e ( ) ; KO

3 F i g u r e f 2 = new P o i n t ( 1 , 2 ) ; OK

4 P o i n t p = new P o i n t ( 2 , 3 ) ; OK

5 p . t r a n s l a t e r (new P o i n t ( 1 , 1 ) ) ; OK

6 f 2 . t r a n s l a t e r ( p ) ; OK

7 p . t r a n s l a t e r ( f 2 ) ;

KO

(22)

Usages croisés, polymorphisme Classe abstraiteFigure

Constructeur sans argument

méthode abstraitevoid translater (Point p) méthode abstraiteString getType ()

ClassePoint extends Figure

Est-ce possible de faire un usage croisé des classes?

Que doit-on faire dans Point? Que penser des lignes suivantes:

1 F i g u r e f ; OK

2 f = new F i g u r e ( ) ; KO

3 F i g u r e f 2 = new P o i n t ( 1 , 2 ) ; OK

4 P o i n t p = new P o i n t ( 2 , 3 ) ; OK

5 p . t r a n s l a t e r (new P o i n t ( 1 , 1 ) ) ; OK

6 f 2 . t r a n s l a t e r ( p ) ; OK

7 p . t r a n s l a t e r ( f 2 ) ; KO

(23)

Un dynamisme étonnant Classe abstraiteFigure

Constructeur sans argument

méthode abstraitevoid translater (Point p) méthode abstraiteString getType ()

méthodeString toString()(1) ClassePoint extends Figure

méthodeString toString()(2)

1 Je peux faire appel àgetType dans la classeFigure!

1 // Dans F i g u r e

2 p u b l i c v o i d a f f i c h e r ( ) {

3 S y s t e m . o u t . p r i n t l n (" J e ␣ s u i s ␣ de ␣ t y p e : ␣ " + g e t T y p e ( ) ) ;

4 }

2 Code mystère:

1 // Dans f i g u r e

2 p u b l i c v o i d a f f i c h e r 2 ( ) {

3 S y s t e m . o u t . p r i n t l n ( t o S t r i n g ( ) ) ;

4 }

5 // d a n s l e main

6 P o i n t p = new P o i n t ( 1 , 2 ) ; // ou F i g u r e p

7 p . a f f i c h e r 2 ( ) ; // (1)ou(2)

(2)!!

(24)

Un dynamisme étonnant Classe abstraiteFigure

Constructeur sans argument

méthode abstraitevoid translater (Point p) méthode abstraiteString getType ()

méthodeString toString()(1) ClassePoint extends Figure

méthodeString toString()(2)

1 Je peux faire appel àgetType dans la classeFigure!

1 // Dans F i g u r e

2 p u b l i c v o i d a f f i c h e r ( ) {

3 S y s t e m . o u t . p r i n t l n (" J e ␣ s u i s ␣ de ␣ t y p e : ␣ " + g e t T y p e ( ) ) ;

4 }

2 Code mystère:

1 // Dans f i g u r e

2 p u b l i c v o i d a f f i c h e r 2 ( ) {

3 S y s t e m . o u t . p r i n t l n ( t o S t r i n g ( ) ) ;

4 }

5 // d a n s l e main

6 P o i n t p = new P o i n t ( 1 , 2 ) ; // ou F i g u r e p

7 p . a f f i c h e r 2 ( ) ; // (1)ou(2) (2)!!

Références

Documents relatifs

x tracer n'importe quelle figure géométrique (manipulation de l iéquerre, du compas, du rapporteur. 1° CINQ FIGURES GÉOMÉTRIQUES découpées dans du carton de

C'est alors que je leur ai proposé un brevet des surface s qui a eu leur assentiment total et do nt nous avons tout de su ite tracé les grandes lig nes.. LE

Réunir à l’intérieur d’une même expression deux mots aux sens opposés.. - Une

Le travail présenté dans ce manuscrit a permis de mettre en évidence l'utilité du Doppler continu pour la détection des sténoses carotidiennes, et comment les

Explosion dans le

[r]

Les carrés ont 4 cm de côté et les losanges ont pour grande diagonale 10 cm et pour petite diagonale 4 cma. Le périmètre de ma chambre est

Les carrés ont 4 cm de côté et les losanges ont pour grande diagonale 10 cm et pour petite diagonale 4 cma. Le périmètre de ma chambre est