• Aucun résultat trouvé

8 H´ eritage et interface

Exercice 53 – Red´efinition de la m´ethodeequals Soit la classePointci-dessous :

1public c l a s s P o i n t {

2 private i n t x , y ; // c o o r d o n n e e s

3 public P o i n t (i n t a , i n t b ) {x=a ; y=b ;}

4 public P o i n t ( ) {x =0; y =0;}

5 public P o i n t ( P o i n t p ) { x=p . x ; y=p . y ;}

6

7 public s t a t i c void main ( S t r i n g [ ] a r g s ) {

8 P o i n t p1 = new P o i n t ( 5 , 2 ) ;

9 P o i n t p2 = new P o i n t ( 5 , 2 ) ;

10 P o i n t p3 = p1 ;

11 P o i n t p4 = new P o i n t ( 1 , 1 ) ;

12 System . o u t . p r i n t l n (" p1 = p2 : "+ p1 . e q u a l s ( p2 ) ) ;

13 System . o u t . p r i n t l n (" p1 = p3 : "+ p1 . e q u a l s ( p3 ) ) ;

14 System . o u t . p r i n t l n (" p1 = p4 : "+ p1 . e q u a l s ( p4 ) ) ;

15 }

16}

Q 53.1Qu’affiche l’ex´ecution du main ?

Q 53.2R´ed´efinir la m´ethodeboolean equals(Object ob)de la classeObjectdans la classePoint, de fa¸con qu’elle teste l’´egalit´e des coordonn´ees et non des r´ef´erences. Les instructions de test sont fournies dans la m´ethodemain.

Q 53.3Que se passe-t-il si dans la m´ethodemain, on rajoute `a la suite les instructions suivantes ? Comment r´esoudre le probl`eme rencontr´e ?

1S t r i n g s 1=new S t r i n g (" Bonjour ") ;

2System . o u t . p r i n t l n (" p1 = s1 : "+ p1 . e q u a l s ( s 1 ) ) ;

Exercice 54 – InterfaceSubmarine Soient les trois classes suivantes :

public abstract c l a s s Animal {}

public abstract c l a s s Mammifere extends Animal {}

public c l a s s Chat extends Mammifere {}

On consid`ere la propri´et´e de pouvoir se d´eplacer sous-l’eau. On suppose que les poissons, les dauphins (mammif`eres) et les bateaux sous-marins ont la propri´et´e de pouvoir se d´eplacer sous l’eau. Les merlus sont des poissons.

Q 54.1 Dessiner le diagramme de classe pour les classes Animal, Chat, Dauphin, Mammifere, Merlu, Poisson, SousMarinet l’interface Submarine.

Q 54.2Ecrire l’interfaceSubmarinequi contient une m´ethodeseDeplacer.

Q 54.3Les poissons forment une famille d’animaux qui peuvent se d´eplacer sous l’eau. Ecrire la classePoisson.

Q 54.4Soit la classe suivante : public class Merlu extends Poisson {}. Un merlu a-t-il la propri´et´e de nager sous l’eau ?

L’´echolocation consiste `a envoyer des sons et `a ´ecouter leur

´echo pour localiser des ´el´ements d’un environnement. Soit l’interfaceEcholocationsuivante :

public i n t e r f a c e E c h o l o c a t i o n { public void e n v o y e r S o n ( ) ; public void e c o u t e r S o n ( ) ; }

Q 54.5 Un dauphin est un mammif`ere qui peut se d´eplacer sous l’eau et faire de l’´echolocation. Ecrire la classe Dauphin.

Q 54.6Un sous-marin peut se d´eplacer sous l’eau et faire de l’´echolocation. Ecrire la classeSousMarin.

Q 54.7Ecrire une classe Merqui contient un attribut de typeArrayListde Submarine, qui contient une m´ethode pour ajouter un ´el´ement dans la liste et une autre m´ethode pour d´eplacer tous les ´el´ements.

Q 54.8 On suppose que l’on est dans une m´ethode main d’une classe TestSubmarine, cr´eer une mer, y ajouter un merlu, un dauphin et un sous-marin, puis d´eplacer-les dans la mer.

Q 54.9Peut-on ajouter un chat dans la mer ?

Q 54.10 On suppose qu’une certaine esp`ece de chats tr`es particuliers aime nager sous-l’eau dans la mer. Peut-on ajouter une classeChatSubcorrespondante `a cette esp`ece ? Faut-il modifier la classeMerpour cela ?

Exercice 55 – InterfaceMotorise

On suppose que tous les v´ehicules motoris´es (voiture, moto...) doivent faire le plein d’essence r´eguli`erement `a la station service.

1public abstract c l a s s V e h i c u l e {

2 public abstract void r o u l e r ( ) ;

3}

4public c l a s s Velo extends V e h i c u l e {

5 public void r o u l e r ( ) { System . o u t . p r i n t l n (" Le v ´e lo roule ") ; }

6}

7public c l a s s V o i t u r e extends V e h i c u l e {

8 public void r o u l e r ( ) { System . o u t . p r i n t l n (" La voiture roule ") ; }

9 public void f a i r e L e P l e i n ( ) {System . o u t . p r i n t l n (" Le plein de la voiture est fait ") ;};

10}

11public c l a s s Moto extends V e h i c u l e {

12 public void r o u l e r ( ) { System . o u t . p r i n t l n (" La moto roule ") ; }

13 public void f a i r e L e P l e i n ( ) {System . o u t . p r i n t l n (" Le plein de la moto est fait ") ;};

14}

15public c l a s s S t a t i o n S e r v i c e {

16 public void r e m p l i r R e s e r v o i r ( V e h i c u l e v ) {

page 34 8. H´eritage et interface

17 i f ( v i n s t a n c e o f V o i t u r e ) ( ( V o i t u r e ) v ) . f a i r e L e P l e i n ( ) ;

18 i f ( v i n s t a n c e o f Moto ) ( ( Moto ) v ) . f a i r e L e P l e i n ( ) ;

19 e l s e System . o u t . p r i n t l n (" Inutile pas de r ´e servoir ") ;

20 }

21}

22public c l a s s T e s t V e h i c u l e s {

23 public s t a t i c void main ( S t r i n g [ ] a r g s ) {

24 V e h i c u l e [ ] t a b={new Velo ( ) , new V o i t u r e ( ) , new Moto ( )};

25 S t a t i o n S e r v i c e s t a t i o n=new S t a t i o n S e r v i c e ( ) ;

26 f o r(i n t i =0; i<t a b . l e n g t h ; i ++) {

27 t a b [ i ] . r o u l e r ( ) ;

28 s t a t i o n . r e m p l i r R e s e r v o i r ( t a b [ i ] ) ;

29 }

30 } }

Q 55.1Expliquez pourquoi la m´ethoderemplirReservoir(Vehicule v)de la classeStationServicen’est pas bien programm´ee (aide : cette m´ethode est-elle toujours correcte, si on ajoute une classeCamion?). Proposez une solution sans utiliser d’interface Java.

Q 55.2 Cr´eer un tableau avec un v´elo, une voiture et une moto, et faire le plein de tous ´el´ements du tableau `a la station service.

Q 55.3 Maintenant, on suppose qu’il existe des engins qui ne sont pas des v´ehicules (par exemple, tondeuse, tron¸conneuse...), mais dont on veut quand mˆeme pouvoir faire le plein `a la station service. La solution pr´ec´edente fonctionne-t-elle ? Proposez une autre solution.

Q 55.4Cr´eer un tableau avec un v´elo, une voiture et une tondeuse et faire le plein de tous ´el´ements du tableau `a la station service.

Exercice 56 – H´eritage d’interfaces pour les v´ehicules

Nous souhaitons g´erer une grande liste de v´ehicule `a moteur, chacun d’eux ayant comme propri´et´e de pouvoir : demarreret s’arreter. Pour clarifier l’organisation des v´ehicules, nous introduisons une hi´erarchie incluant lesRoulant (poss´edant une m´ethodevoid rouler()), lesVolant (m´ethodevoler()) et lesFlottant(m´ethodenaviguer()).

Q 56.1Donner la hi´erarchie d’interface `a cr´eer.

Q 56.2Donner la signature de la classeVoitureet les m´ethodes `a coder imp´erativement.

Q 56.3Donner la signature de la classeHydravionet les m´ethodes `a coder imp´erativement.

Exercice 57 – InterfaceReversible

Une interface correspond `a une propri´et´e. Nous envisageons dans cet exercice la propri´et´e de reversibilit´e. Pour une chaine de caract`eres, il s’agit de pouvoir la lire `a l’envers lorsqu’on le souhaite, pour un tableau, de prendre les ´el´ements dans l’ordre oppos´e. Nous choisissons arbitrairement de d´efinir cette propri´et´e sans argument et sans retour : il s’agit juste de modifier l’´el´ement invoquant la m´ethode.

Q 57.1Donner le code de l’interfaceReversible.

Q 57.2Donner le code de la classeStringReversible. Nous rappelons que la classe String est immutable etfinal.

Vous aurez besoin des m´ethodes de String suivantes : int length() qui renvoie la longueur de la chaine et char charAt(int i)qui renvoie le caract`ere `a la positioni.

Q 57.3Donner deux exemples d’utilisation dans unmain. Est-il possible de d´eclarer une variable de typeReversible? Q 57.4 Nous souhaitons maintenant cr´eer une structure de type ArrayList r´eversible. Donner le code ´etendant l’ArrayList<Object>, ajoutant les m´ethodes n´ecessaire (donttoString() et surchargeant la m´ethodeget.

NB : ajouter un attribut bool´een indiquant si la structure est renvers´ee ou pas.

Q 57.5Ajouter quelques lignes de code pour rendre la r´eversibilit´e r´ecursive quand c’est possible dans la structure pr´ec´edente. Par exemple, quand la liste contient desStringReversible, nous souhaitons renverser la liste ET renverser

les ´el´ements de la liste si c’est possible.

Q 57.6 (Option) Proposer une seconde impl´ementation de la structure de donn´ees r´ecursive bas´ee sur la composition et non plus sur l’h´eritage (attribut ArrayListau lieu deextends ArrayList)

Exercice 58 – InterfaceComparable

Nous nous pla¸cons maintenant comme utilisateur d’un cadre d´efini pour les interfaces. Nous avons besoin de trier une liste de vecteurs en fonction de leur norme. Nous disposons de la classe de base :

1public c l a s s V e c t e u r {

2 private double x , y ;

3 public V e c t e u r (double x , double y ){

4 t h i s. x = x ;

5 t h i s. y = y ;

6 }

7 public double norme ( ){return Math . s q r t ( x∗x+y∗y ) ;}

8}

La Javadoc nous indique : (1) dans la classeCollections:

1s t a t i c <T extends Comparable<? super T>> void s o r t ( L i s t<T> l i s t )

2// S o r t s t h e s p e c i f i e d l i s t i n t o a s c e n d i n g o r d e r , a c c o r d i n g t o t h e n a t u r a l o r d e r i n g o f i t s e l e m e n t s .

3s t a t i c <T> void s o r t ( L i s t<T> l i s t , Comparator<? super T> c )

4// S o r t s t h e s p e c i f i e d l i s t a c c o r d i n g t o t h e o r d e r i n d u c e d by t h e s p e c i f i e d c o m p a r a t o r . (2) Interface Comparable

1i n t compareTo (T o ) // Compares t h i s o b j e c t w i t h t h e s p e c i f i e d o b j e c t f o r o r d e r .

2// s i x<y a l o r s , x . compareTo ( y ) < 0

3// s i x . e q u a l s ( y ) a l o r s x . compareTo ( y ) == 0

4// s i n o n x . compareTo ( y ) > 0 (3) Interface Comparator

Q 58.1Indiquer les modifications `a effectuer dans la classeVecteurpour utiliserComparable

Q 58.2Donner le code d’un main effectuant le tri d’une liste de Vecteurg´en´er´ee al´eatoirement par rapport `a leurs normes.

Q 58.3Donner la proc´edure et le code pour utiliser unComparator. Quel est l’avantage de cette approche ? Exercice 59 – Attribut de typeArrayList

Soient les classes suivantes :

1import j a v a . u t i l . A r r a y L i s t ;

2

3public abstract c l a s s A {

4 public abstract void a f f i c h e r ( ) ;

5}

6public c l a s s B extends A {

7 public void a f f i c h e r ( ) {

8 System . o u t . p r i n t l n (" je suis un B ") ;

9 }

10 public void methodeDeB ( ) {

11 System . o u t . p r i n t l n (" Methode de B ") ;

12 }

13}

14public c l a s s C extends A {

15 public void a f f i c h e r ( ) {

16 System . o u t . p r i n t l n (" je suis un C ") ;

17 }

page 36 8. H´eritage et interface

18 public void methodeDeC ( ) {

19 System . o u t . p r i n t l n (" Methode de C ") ;

20 }

21}

On souhaite cr´eer une classe qui g`ere une liste d’objets dont la classe m`ere est A.

Q 59.1Expliquez la ligne 1.

Q 59.2Ecrire la classeListeDeAqui poss`ede une seule variable d’instance appel´eeliste qui est de typeArrayList deA(voir la documentation de la classeArrayList`a la page56). Ajoutez-y un constructeur qui prend en param`etre le nombrend’objets `a cr´eer `a l’initialisation de la liste. Ce constructeur cr´ee al´eatoirement 50% d’objets de typeBet 50% d’objets de typeCet les ajoute `a la liste.

Q 59.3Ajoutez `a la classeListeDeAune m´ethodeafficherListe()qui appelle la m´ethodeafficher() de chacun des objets de la liste. Utilisez cette m´ethode dans une m´ethodemain.

Q 59.4Ajoutez `a la classe ListeDeAune m´ethodeafficherMethode() qui pour chaque objet de la liste appelle la m´ethodemethodeB() si cet objet est un objet de typeB, et appelle la m´ethodemethodeC() si cet objet est un objet de typeC. Utilisez cette m´ethode dans une m´ethodemain.

Exercice 60 – Compagnie de chemin de fer (ArrayList, instanceof )

Une compagnie de chemin de fer veut g´erer la formation de ses trains, `a partir de la description suivante. Un train est form´e d’´el´ements de train. Un ´el´ement de train poss`ede un num´ero de s´erie et une marque. Un ´el´ement de train est soit une motrice, soit un wagon. Une motrice a une puissance. Un wagon a un nombre de portes. Un wagon peut ˆetre soit un wagon voyageurs, auquel cas il poss`ede un nombre de places, soit un wagon de marchandise, auquel cas il poss`ede un poids maximum repr´esentant la charge maximale qu’il peut transporter.

Q 60.1Dessiner la hi´erarchie des classesTrain,ElemTrain,Motrice, Wagon, WVoyageuret WMarchandise.Q 60.2 Ecrire les classes ElemTrain(abstraite),Wagon (abstraite),Motrice, WVoyageuret WMarchandiseavec au moins un constructeur avec param`etres et une red´efinition de la m´ethode public String toString() qui retourne pour un

´el´ement son type et son num´ero de s´erie, par exemple :Wagon Marchandise 10236 (Alstom). Pour plus de propret´e, vous utiliserez un compteurstaticpour g´en´erer les num´eros de s´erie commen¸cant `a 10000.

Q 60.3Un Train poss`ede une motrice et une une suite de wagons (on g`erera cette suite obligatoirement par la classe ArrayList(voir la documentation page56). Ecrire la classeTrainavec au minimum un constructeur a un param`etre de typeMotricequi construit un train r´eduit `a cette motrice, et ayant donc un ensemble vide de wagons.

Q 60.4Ajouter une m´ethodevoid ajoute(Wagon w)qui ajoute un wagon au vecteur de wagons du train.

Q 60.5Red´efinir la m´ethodepublic String toString()qui retourne la composition de ce train.

Q 60.6Ecrire une m´ethodepoids() qui retourne le poids maximum de marchandise que peut transporter le train.

Indication: On peut utiliser l’op´erateurinstanceofqui rend vrai si et seulement si un objet est instance d’une classe.

Exemple d’utilisation :if (a instanceof A)...

Q 60.7Ecrire la m´ethode principalepublic static void main(String[] args)dans une classeMainTrain. Cette m´ethode cr´ee une motrice, des wagons de voyageur et des wagons de marchandise, cr´ee un train form´e de ces ´el´ements, affiche la composition de ce train ainsi que le poids transport´e.

Documents relatifs