[débutant] Problème polymorphisme,surcharge et héritage
Bonjour à tous,
J'essaye de résoudre une question d'un examen de juin 2003 et j'aurais besoin d'un coup de pouce pour une partie assez tordue du problème ...
voici le code :
Code:
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 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
|
class P {
static void rint (String s) {
System.out.println(s);
}
}
abstract class A {
String valueOf(){ return "[A]"; }
void m(A x, A y){
P.rint( "Classe A" );
P.rint( valueOf() + x.valueOf() + y.valueOf() );
}
}
class B extends A {
void m(A x, A y){
P.rint( "Classe B" );
P.rint( "[B]" + x.valueOf() + y.valueOf() );
}
void m(A x, B y){ super.m(x, y); }
void m(B y, A x){ m((A)y, x); }
}
class C extends B {
String valueOf(){ return "[C]"; }
void m(B x, B y){
P.rint( "Classe C" );
P.rint( "[C]" + x.valueOf() + y.valueOf() );
}
}
class appel {
public static void main(String[] args) {
A a = new B();
B b = new C();
P.rint("/ 1 /");
a.m(a, b);
P.rint("/ 2 /");
a.m(b, b);
//! b.m(b, b); // génère l'erreur suivante à la compilation :
// appel.java:43: reference to m is ambiguous, both method m(A,B) in B
and method m(B,A) in match b.m(b, b);
//
}
} |
voilà la sortie du programme :
/ 1 /
Classe B
[B][A][C]
Question 1 : Pourquoi la méthode appelée est B.m(A x, A y) au lieu de B.m(A x, B y) ?
Pourtant dans l'appel de méthode a.m(a, b), le paramètre a est bien de type statique A et b de type statique B !
/ 2 /
Classe B
[B][C][C]
Question 2 : Pourquoi la méthode appelée est B.m(A x, A y) ?
Dans l'appel de méthode a.m(b, b), les 2 paramètres sont de type statique B, pourquoi Java "upcast"-t-il les 2 paramètres vers le type A de manière à utiliser la méthode B.m(A x,A y) et pas plutôt uniquement le premier paramètre de manière à appeler la méthode B.m(B y,A x) ?
Question 3 : Si on décommente la ligne b.m(b.b), on obtient l'erreur de compilation mentionnée plus haut. Pourquoi ?
Comme l'Objet b est de type dynamique C et que les paramètres sont tous les deux de type statique B, Java devrait simplement appeler la méthode C.m(B x, B y) non ?
J'ai parcouru pas mal de cours et de tutoriels mais je n'ai pas trouvé d'explications précises à ces cas particuliers...
grand merci pour votre aide,
effco