Sie sind auf Seite 1von 5

Master 2 BBSG

POO, langage Java

Henri Garreta et Laurent Tichit

4. Classes abstraites, interfaces


1. 2. 3. 4. Numrophagie Abstraction, classes abstraites, interfaces Interfaces et objets fonctionnels Hritage multiple et Ja a

4.1 Numrophagie
!"objet #e cet e$ercice est la ralisation #"une ersion oriente objets #u bon ieu$ crible dEratosthne. !e crible #"%ratosth&ne est un algorithme pour obtenir les nombres premiers infrieurs ' un certain nombre n. (our cela, on consi#&re la suite #es entiers #e 2 ' n. )n pren# le premier *2+ et on fait #ispara,tre ses multiples *4, -, ., etc.+ / apr&s 0uoi on pren# le sui ant #e ceu$ 0ui restent *3+ et on supprime ses multiples *1, 12, 21, etc.+ / puis le sui ant *2+ et on enl& e ses multiples *22, 32, 22, etc.+ et ainsi #e suite. 3"est comme si 2 4 mangeait 5 tous ses multiples, puis 3 mangeait ses multiples restants *ceu$ 0ue 2 n"a pas mang+, puis 2 mangeait les siens, etc. 6"o7 l"i#e #e #finir cha0ue nombre premier comme un objet mangeur #e nombres, ou Mangenombres. !es mangenombres sont arrangs en une sorte #e liste cha,ne 8 chacun a un successeur. 6e plus, sauf le premier 0u"il faut crer 4 ' la main 5, chacun est cr le moment venu par un mangenombres pre$istant, son pr#cesseur 8

On donne 17 manger 2. Une o ration !ui rovo!uera la cration dun Mangenombres 17" successeur de 1#.

9cri e: la classe Mangenombres, comportant #eu$ ariables #"instance 8 un nombre et une rfrence *initialement nulle+ sur le mangenombres successeur, #eu$ mtho#es 8 un constructeur et une opration 4 manger un nombre 5. !e mangenombres m associ au nombre mange les multiples #e 8 si on lui #onne ' manger un nombre ! 0ui n"est pas multiple #e , m le #onne ' manger ' son successeur, s"il e$iste. ;i m n"a pas #e successeur, celui<ci est cre, associ au nombre !. !a cration #"un mangenombres m! #oit pro o0uer l"affichage #e !. 9cri e: un programme principal affichant pour afficher les nombres premiers entre 2 et un certain n. 3e programme #oit crer un premier mangenombres, associ au nombre premier 2, puis e$cuter une boucle #ans la0uelle les nombres #e 2 ' n sont #onns ' manger ' ce premier mangenombres.

4.2 Abstraction, classes abstraites, interfaces


6ans cet e$ercice on ous #eman#e #e #finir un ensemble #e classes pour reprsenter #es $onctions

dune variable formes a ec #es constantes, #es occurrences #e la ariable %, les 0uatre oprations arithmti0ues =, >, ?, @ et #es appels #e 0uel0ues fonctions con enues comme sin, cos e% , log, etc. (ar e$emple 8 12 % = sin*3% > 2+ 6ans un programme, une e$pression comme celle<l' peut Atre efficacement reprsente par une structure arborescente, organise comme le montre la figure ci<contre, faite #e feuilles *les constantes et les ariables+, #e nBu#s ' #eu$ 4 #escen#ants 5 *les oprateurs binaires+ et #e nBu#s ' un #escen#ant *les fonctions #"une ariable+. !es classes 0u"il faut #finir sont #estines ' reprsenter les nBu#s #"un tel arbre. Il C en a #onc #e plusieurs sortes 8 un nBu# reprsentant une constante porte un nombre, la aleur #e la constante, un nBu# reprsentant une occurrence #e la variable % ne porte aucune autre information, un nBu# reprsentant une addition, une soustraction, une multi lication ou une division porte #eu$ informations 8 les e$pressions 0ui sont ses opran#es, un nBu# reprsentant l"appel #"une $onction porte comme information l"e$pressions 0ui est son argument. 6finisse: les classes sui antes *la marge tra#uit la relation implements ou extends+ 8 Expression > inter$ace reprsentant ce 0u"ont en commun toutes les e$pressions arithmti0ues *c"est<'<#ire toutes les sortes #e nBu#s #e notre structure arborescente+ 8 elle se compose #"une seule mtho#e 8
public double valeur(double x);

0ui ren oie la aleur #e l"e$pression pour la aleur #e % #onne. Dien enten#u, toutes les classes concr&tes #e cette hirarchie #e ront fournir une #finition #e la mtho#e valeur. %lles fourniront aussi une refinition intressante #e la mtho#e String toString(). Constante > classe concr&te #ont cha0ue instance reprsente une occurrence #"une constante. 3ette classe a un membre 8 la aleur #e la constante. Variable > classe concr&te #ont cha0ue instance reprsente une occurrence #e la ariable %. 3ette classe n"a besoin #"aucun membre. OperationBinaire > classe abstraite rassemblant ce 0u"ont en commun tous les oprateurs ' #eu$ opran#es. %lle a #onc #eu$ membres #"instance, #e tCpe Expression, reprsentant les #eu$ opran#es, et le constructeur 0ui a a ec. Addition, Soustraction, Multiplication, Division > classes concr&tes pour reprsenter les oprations binaires. 3"est ici 0u"on trou e une #finition pertinente #e la mtho#e valeur promise #ans l"interface Expression. Operation naire > classe abstraite rassemblant ce 0u"ont en commun tous les

oprateurs ' un opran#e. %lle #oit a oir un membre #"instance, #e tCpe Expression, reprsentant l"opran#e en 0uestion. Sin, Cos, !og, Exp, etc. > classes concr&tes pour reprsenter les fonctions stan#ar#. Ici on #oit trou er une #finition pertinente #e la mtho#e valeur promise #ans l"interface Expression. )n ne ous #eman#e pas #e rsou#re le probl&me *#ifficile+ #e la 4 lecture 5 #"un tel arbre, c"est<'<#ire #e sa construction ' partir #"un te$te, par e$emple lu ' la console. %n re anche, ous #e e: montrer 0ue otre structure est bien a#apte au calcul #e la aleur #e l"e$pression pour une aleur #onne #e la ariable %. (our cela, on e$cutera un programme #"essai comme celui<ci 8
""" public static void main(String#$ args) % &' codage de la (onction ((x) ) * ' sin(x) + , ' cos(x) '& Expression ( ) ne- Addition( ne- Multiplication( ne- Constante(*). ne- Sin(ne- Variable())). ne- Multiplication( ne- Constante(,). ne- Cos(ne- Variable()))); &' calcul de la valeur de ((x) pour /uel/ues valeurs de x '& double#$ tab ) % 0. 0"1. 2. 2"1. *. *"1 3; (or (int i ) 0; i 4 tab"lengt5; i++) % double x ) tab#i$; S6stem"out"println(7((7 + x + 7) ) 7 + ("valeur(x)); 3 3 """

!"e$cution #e ce programme pro#uit l"affichage #e 8


((0"0) ((0"1) ((2"0) ((2"1) ((*"0) ((*"1) ) ) ) ) ) ) ,"0 ,"182189:;*9:81*<, ,",0,9<999:**0*2*, *"*0:*021:9*22*2:1 0"1:021<,<<0088,;2 =2"*0;<9;119<,*999,

4.3 Interfaces et objets fonctionnels


)n s"atta0ue ici au probl&me sui ant 8 0uel0uefois il est utile 0u"une fonction puisse a oir pour argument une autre fonction. 3omment obtenir cela en Ja a E (ar e$emple, la mtho#e #ite par dichotomie est une techni0ue #e rsolution a roche #e l"0uation 4 $*%+ F G 5. ;ous rser e 0ue $ soit une fonction continue *c"est<'<#ire 4 sans sauts 5+ et 0u"on connaisse #eu$ aleurs a et b telles 0ue les signes #e $*a+ et #e $*b+ soient opposs, alors cette mtho#e trou e rapi#ement une aleur &, comprise entre a et b, 0ui n"est pas plus loigne 0ue e silon #"une solution #e l"0uation $*%+ F G, o7 e silon est une prcision arbitraire fi$e ' l"a ance. 6it autrement 8 la mtho#e trou e & tel 0ue $*&+ F G a ec une erreur infrieure ' e silon. !"algorithme est bien connu / en oici une programmation accompagne #"un essai consistant ' rsou#re %2 > 4 F G *c.<'<#. ' trou er la racine carre #e 4+ a ec une prcision #e 1G <12 *' l"e$cution, ce programme affiche 2"8888888888881<1,+ 8
public class >estDic5otomie %

&' l?appel de la m@t5ode '& public static void main(String#$ args) % double 6 ) Aero(0. <. 2e=2*); S6stem"out"println(6); 3 &' la (onction ((x) ) x ' x = < '& static double ((double x) % return x ' x = <; 3 &' la m@t5ode elle mBme (on suppose /ue ((a) et ((b) sont de signes distincts) '& static double Aero(double a. double b. double epsilon) % &' si on n?a pas ((a) 4 0 on @c5ange a et b '& i( (((a) C 0) % double - ) a; a ) b; b ) -; 3 &' on itDre Eus/u?F avoir Ga = bG 4) epsilon '& -5ile (Mat5"abs(b = a) C epsilon) % double c ) (a + b) & *; i( (((c) 4 0) a ) c; else b ) c; 3 &' lors/ue Ga = bG 4) epsilon. toute valeur comprise entre a et b convient '& return (a + b) & *; 3 3

9crite comme cela, la mtho#e Aero fonctionne mais elle est peu rutilisable, car elle emploie une fonction ( 0ui ne figure pas parmi ses arguments. (our trou er un :ro #"une autre fonction il faut changer le corps #e ( et recompiler ce programme H (lus gra e, puis0ue ( est fig, on ne peut pas #ans le mAme programme utiliser Aero sur #es fonctions #iffrentes. )n a #onc faire en sorte #"crire la mtho#e :ro a ec la fonction parmi les arguments, c"est<'<#ire a ec l"en<tAte
static double Aero(Honction (. double a. double b. double epsilon)

o7 Honction reprsente le 4 concept 5 #e fonction, c"est<'<#ire ce 0ue toutes les fonctions ont en commun. (our ce 0ui nous intresse ici, ce 0ue les fonctions ont en commun est la possibilit #"Atre appeles a ec un double pour argument, et #e ren oCer alors un double comme rsultat. )n intro#uit #onc l"interface 8
public inter(ace Honction % double appel(double x); 3

Exercice. Icri e: la mtho#e Aero en prenant un objet Honction comme premier argument, ensuite cri e: une fonction main 0ui rsout l"0uation cos*%+ F % a ec une erreur infrieure ' 1G<1G. Il ous fau#ra #onc #cfinir un objet Honction #ont la mtho#e appel se r#uit ' 4 return cos(x) I x; 5. 9cri e: l"essai *la mtho#e main+ #e #eu$ mani&res, sans utiliser puis en utilisant les classes anonCmes.

4.4 ritage multiple et !a"a


%n Ja a l"hritage est simple 8 cha0ue classe a une et une seule super<classe *sauf ObEect, 0ui n"a pas #e super<classe+. Jais alors, comment faire lors0ue les objets #"un certain tCpe doivent Atre consi#rs comme appartenant ' #eu$ hirarchies #"hritage, ou plus E 'uestion anne%e 8 pour0uoi serait<on oblig #e #clarer une classe ( comme hritant #e #eu$ autres classes ) et * E 3"est<'<#ire, si on eut 0ue les membres #e ) et ceu$ #e * soient membres #e (, pour0uoi ne suffit<il pas #e mettre #ans ( une ariable #e tCpe ) et une ariable #e tCpe * E + onse. Il est ncessaire 0ue ( soit sous<classe #e ) Kresp. *L si on eut pou oir mettre un objet ( ' un en#roit o7 un objet ) Kresp. *L est pr u. (ar e$emple, si on #ispose #"une mtho#e #clare a ec un argument formel #e tCpe ) Kresp. *L et 0u"on eut l"appeler a ec un argument effectif #e tCpe ( alors il faut 0ue la classe ( soit sous<classe #e ) Kresp. *L. %$emple *un peu tir par les che eu$, ' rai #ire, mais c"est un e$emple...+ 8 un Jersonnel est un fonctionnaire rele ant #u J%N%;I *Jinist&re #e l"9#ucation Nationale, #e l"%nseignement ;uprieur et #e la Iecherche+ / il est #fini par un certain nombre #e ariables #"instances pri es, chacune associe ' une mtho#e publi0ue #e mAme nom 0ui permet #"en obtenir la aleur 8 nom *#e tCpe String+, numeroSS *#e tCpe long+, anneeKaissance *#e tCpe int+, etc. un Enseignant est une entit pou ant #ispenser #es cours / cela peut Atre un personnel #e l"#ucation nationale, mais pas ncessairement *un cours peut Atre #onn par un inter enant e$trieur, un magntoscope, un Mne parlant...+ / comme prc#emment, cela se #finit par un ensemble #e ariables #"instance pri es a ec #es mtho#es publi0ues #"acc&s matiere *#e tCpe String+, classeKiveau *#e tCpe int+, etc. un C5erc5eur est une autre entit non ncessairement membre #e l"#ucation nationale, consacrant une partie #e son temps ' #es recherches / encore une fois, #es ariables #"instance pri es et #es mtho#es publi0ues #"acc&s 8 domaineDeLec5erc5es *#e tCpe String+, nombreJublications *#e tCpe int+ etc. Nous supposerons 0ue Jersonnel, Enseignant et C5erc5eur sont trois classes concr&tes, prc#emment #finies et parfaitement oprationnelles. %n outre, nous supposerons 0ue #es mtho#es sont #isponibles par ailleurs, 0ui prennent pour argument #es objets #e chacune #e ces trois classes 8
static void gestionCarriere(Jersonnel unJersonnel); static void emploiDu>emps(Enseignant unEnseignant); static void rapportActivite(C5erc5eur unC5erc5eur);

!"e$ercice est le sui ant 8 #finir une classe JersonnelEnseignantC5erc5eur #estine ' reprsenter #es personnels #e l"#ucation nationale 0ui sont en mAme temps #es enseignants et #es chercheurs. Il faut utiliser les trois classes Jersonnel, Enseignant et C5erc5eur, et la nou elle classe #oit Atre #finie #e telle mani&re 0ue ses instances puissent Atre #onnes pour argument au$ mtho#es ci<#essus, entuellement au pri$ #"un *tr&s lger+ changement #e nom #e certains tCpes.

Das könnte Ihnen auch gefallen