Bonjour,
Voici un exercice tiré du livre "Exercices en Java" de Claude Delannoy (Editions Eyrolles) et pour ceux qui ont le livre, il s'agit de l'exercice n°66 "dérivations successives et surdéfinition".
... (je cite le livre)
Quels résultats fournit le programme suivant :
le résultat obtenu est :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 class A { public void f(double x) { System.out.print ("A.f(double=" + x +")" ; } } class B extends A {} class C extends A { public void f(long q) { System.out.print ("C.f(long=" + q + ") " ; } } class D extends C {public void f(int n){System.out.print("D.f(int="+n+")");} } class E extends B {} class F extends C { public void f(float x){ System.out.print("F.f(float="+x+")");} public void f(int n){ System.out.print("F.f(int="+n+")");} } public class Surdf { /** * @param args */ public static void main(String[] args) { byte bb=1; short p=2; int n=3; long q=4; float x=5.f; double y=6.; A a = new A(); a.f(bb); a.f(x); System.out.println(); B b = new B(); b.f(bb); a.f(x); System.out.println(); C c = new C(); c.f(bb); c.f(q); c.f(x); System.out.println(); D d = new D(); d.f(bb); c.f(q); c.f(y); System.out.println(); E e = new E(); e.f(bb); e.f(q); e.f(y); System.out.println(); F f = new F(); f.f(bb); f.f(n); f.f(x); f.f(y); f.f(p); System.out.println(); } }
l'Auteur précise : ...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 A.f(double=1.0)A.f(double=5.0) A.f(double=1.0)A.f(double=5.0) C.f(long=1)C.f(long=4)A.f(double=5.0) D.f(int=1)C.f(long=4)A.f(double=6.0) A.f(double=1.0)A.f(double=4.0)A.f(double=6.0) F.f(int=1)F.f(int=3)F.f(float=5.0)A.f(double=6.0)F.f(int=2)
Ici, on fait intervenir à la fois la redéfinition d’une méthode et sa surdéfinition. Pour résoudre un appel de la forme o.f(v) (o étant un objet et v une expression), on recherche toutes les méthodes acceptables, à la fois dans la classe de o et dans toutes ses ascendantes. On utilise ensuite les règles habituelles de recherche de la meilleure (et unique) méthode. En définitive, le programme fournit les résultats suivants (notez que certaines conversions peuvent apparaître) :
... (fin de citation du livre)
Qui pourrait expliquer (simplement :-) les critères qui ont déterminé le choix de la meilleure méthode pour chaque ligne de code ?
Sans en être sur, je suppose qu'il doit s’agir d'un problème d'affectation sans perte d'information ... mais je n'ai trouvé aucun tutoriel ou article sur ce sujet précis ou j'ai mal cherché ;-).
Merci pour vos commentaires et explications.
Cordialement.
Partager