Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1654 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  Débutant : Polymorphisme

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Débutant : Polymorphisme

n°1583668
nikhel
Cagou
Posté le 08-07-2007 à 03:45:33  profilanswer
 

Bonjour,  
 
J'ai une question basique sur le polymorphisme en Java.  
 
Lors d'un cours de Java nous avons étudié l'algo suivant :
 

Code :
  1. abstract class Nombre
  2. {
  3.     abstract Nombre plus(Nombre b);
  4. }
  5. class Entier extends Nombre
  6. {
  7.     int val;
  8.    
  9.     Entier(int n)
  10.     {
  11.         val = n;
  12.     }
  13.    
  14.     Nombre plus(Nombre n)
  15.     {
  16.         System.out.println("plus d’Entier" );
  17.         return null;
  18.     }
  19. }
  20. class Reel extends Entier
  21. {
  22.     int denom;
  23.    
  24.     Reel(int n, int n2)
  25.     {
  26.         super(n);
  27.         denom=n2;
  28.     }
  29.  
  30.     Reel plus(Reel n)
  31.     {
  32.         System.out.println("plus de Reel" );
  33.         return new Reel(9, 9);
  34.     }
  35.    
  36. }
  37. class Exercice
  38. {
  39.     Nombre n1;
  40.    
  41.     Exercice(Nombre n)
  42.     {
  43.         n1=n;
  44.     }
  45.    
  46.     Nombre eval(Nombre n2)
  47.     {
  48.         return n1.plus(n2);   // marque 1
  49.     }
  50.    
  51.     public static void main(String[] args)
  52.     {
  53.         Nombre x1;
  54.         x1 = new Reel(4,5);
  55.         Nombre x2 = new Entier(5);
  56.         Reel x3 = new Reel(1,2);
  57.         Entier x4 = new Reel(1,8);
  58.        
  59.         (new Exercice(x1)).eval(x1); // marque 2
  60.         (new Exercice(x4)).eval(x4); // marque 3
  61.         (new Exercice(x3)).eval(x2); // marque 4
  62.         (new Exercice(x2)).eval(x3); // marque 5
  63.     }
  64. }


 
La trace du programme est la suivante :

plus d’Entier
plus d’Entier
plus d’Entier
plus d’Entier


 
Ce que je ne comprend pas c'est qui ce passe à la ligne marque 2.
 
D'après ce que l'on m'a expliqué, l'identification de la méthode appelée se fait par le type de l'instance de l'objet placé en paramètre (même s’il y a un upcast).
Ainsi dans mon cas, quand j'appelle la méthode eval d'Exercice, le paramètre est de type réel (classe dérivée de Nombre). Donc normalement, ce devrait être la méthode plus de réél qui devrait être appelé ! Mais comme vous pouvez le voir dans la trace, ça n'est pas du tout le cas !
En débuge sur NetBean, je vois bien que lors de l'exécution de la méthode eval, le type de n1 et n2 est réel.
 
Est-ce que quelqu'un pourrait m'expliquer pourquoi le programme réagit ainsi ?
 
Merci d'avance à tous.  :pt1cable:


Message édité par nikhel le 08-07-2007 à 03:53:30
mood
Publicité
Posté le 08-07-2007 à 03:45:33  profilanswer
 

n°1583669
deadalnix
Posté le 08-07-2007 à 05:09:20  profilanswer
 

Le premier x1 est bien traité comme un reel, mais la ou tu te fais embrouiller c'est que le deuxieme est apssé comme un nombre.
 
Je m'explique :
 
tu as (new Exercice(x1)).eval(x1); avec x1 une variable de type nombre.
 
Le fait que x1 soit initialié en tant que reel aurait fait en sorte que java lance en priorité un fonction de reel plutot que de nombre ou entier, mais il se trouve que tu as typé x1 comme entier, ce n'est donc pas un reel a prioris (indepedement du fait que tu l'as construit comme tel) mais un nombre.
 
Ton parametre etant un nombre, Reel plus(Reel n) n'a pas le bon typage, et laisse sa place a Nombre plus(Nombre n)

n°1583672
nikhel
Cagou
Posté le 08-07-2007 à 07:17:47  profilanswer
 

Salut,
 
Merci pour tes explications !!!!

n°1583678
esox_ch
Posté le 08-07-2007 à 09:12:39  profilanswer
 

Question conne : Pourquoi x1 est typé comme un entier ?

n°1583686
nikhel
Cagou
Posté le 08-07-2007 à 10:26:51  profilanswer
 

esox_ch a écrit :

Question conne : Pourquoi x1 est typé comme un entier ?


 
Je te retourne ta réponse !  
C'est le but de l'exercice : te piéger. Ce n'est pas un algo logique, c'est juste pour nous faire travailler Java.
Excuse moi de poser des questions aussi c....  

n°1583795
Taz
bisounours-codeur
Posté le 09-07-2007 à 00:39:21  profilanswer
 

c'est Java qui est défaillant, ni covariance, ni contravariance

n°1584177
esox_ch
Posté le 09-07-2007 à 17:43:32  profilanswer
 

nikhel a écrit :

Je te retourne ta réponse !  
C'est le but de l'exercice : te piéger. Ce n'est pas un algo logique, c'est juste pour nous faire travailler Java.
Excuse moi de poser des questions aussi c....


 
Non mais je crois que t'as pas compris... La question conne c'est moi qui la pose, parce que j'ai pas compris pourquoi x1 est typé comme un entier, moi j'aurai dit que c'est un réel vu qu'il est construit avec Nombre x1 = new Reel(int,int);


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
n°1584197
deadalnix
Posté le 09-07-2007 à 18:35:31  profilanswer
 

Bon, je reexplique :
 
tu as Nombre x1 = new Reel(int,int);
 
Quand tu apelle une methode sur l'instance x1, elle va d'abord chercher si la fonction que tu apelle est dans reel. Ici, tu apelle x1.plus(x1). Mais ton second x1 n'est a prioris pas un reel, c'est un nombre.
 
Reel plus(Reel n) ne peut donc pas etre choisis.

n°1584206
esox_ch
Posté le 09-07-2007 à 18:51:02  profilanswer
 

Ahh oui j'ai compris.
Vu que Exercice.eval(Nombre n) va me typer mon x1 comme un nombre, bein après il va appeler la méthode de la classe mère car prenant comme argument un nombre ... merci beaucoup :D


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  Débutant : Polymorphisme

 

Sujets relatifs
Question de débutant sur flashPB a la compilation. (debutant inside)
Javascript : erreur un peu difficile à comprendre pour un débutant[Débutant] Truc débile
[Débutant] Delphi ou PythonProgrammation VBS par un débutant
[C] Petit soucis de debutant, certainement vraiment tres bete...Problème bizarre avec GCC (pour débutant)
[Visual C++] serialize débutantdebutant vbs
Plus de sujets relatifs à : Débutant : Polymorphisme


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR