Le titre peux paraitre un peu flou, je vais essayer d'être claire.
Voilà j'ai une classe A1, qui englobe une classe interne B, avec une méthode M
Ensuite j'ai une classe A2 dérivé de A1, qui redéfinit B, et M.
Si j'instancie A2 en le typant en A1 et que j'appelle la méthode M, alors pas de problème la liaison dynamique(polymorphique) et c'est bien la fonction M de la classe A2 qui est exécute.
Par contre si j'appel la classe interne B , alors là je me retrouve avec la classe interne de A1. Et le plus étonnant et si je fait un appel à M depuis cette classe interne, il retrouve la liaison dynamique et c'est la méthode M de la classe A2 qui est exécute.
Par du code ca donne :
Quelqu'un pourrait me dire pourquoi ca fait ca, et si il y a un moyen de forcer la liaison dynamique car ca m'embête un peux de revoir l'organisation de mes classes.
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45 public class Main { public static void main(String[] args) throws Exception { A1 obj = new A2(); //appel la méthode M obj.M(); //donne : Méthode M de A2 //initialise la classe interne obj.new B(); //donne : constructeur B de A1 -- Méthode M de A2 // au lieux de : constructeur B de A2 -- Méthode M de A2 //initialise la classe interne avec un accesseur obj.setB(); //donne : constructeur B de A1 -- Méthode M de A2 // au lieux de : constructeur B de A2 -- Méthode M de A2 } } class A1 { public class B{ public B() { System.out.println("constructeur B de A1"); M(); } } public void M(){ System.out.println("Méthode M de A1"); } public void setB(){ new B(); } } class A2 extends A1 { public class B{ public B() { System.out.println("constructeur B de A2"); M(); } } public void M(){ System.out.println("Méthode M de A2"); } }
Merci
Partager