[JAVA] Rédifinition méthode

Rédifinition méthode [JAVA] - Programmation

Marsh Posté le 18-03-2002 à 22:19:16    

Voila je bataille depuis un moment sur un problème de redifinition de méthode. Dans ce cas pourtant simple, il me semblait.
Je m'explique :
 
1 classe parente avec 1 méthode d'affichage des attributs de la classe, Employe :
package societe.donnees;
 
public class Employe implements java.io.Serializable {
 
    ...
    public void affichage() {
 
        System.out.print(prenom+" "+nom+'\n'
    +"Domicile    : "+adresse+'\n'
    +"Tél.        : "+tel+'\n'
    +"N° de sécun : "+n_secu+'\n'
    +"Matricule   : "+matricule+'\n'
    +"Agence      : "+agence+'\n'
    +"Embauche le : " );
 date_embauche.affichage();
    }
}
 
+ 1 classe fille avec une redéfinition de la méthode affichage(pour afficher 2 attributs supplémentaires) :
 
package societe.donnees;
 
public class Commercial extends Employe {
 
    double ca;
    String voiture;
    ...
    Ici appel du constructeur de la classe mère par super(...)  
    + assignation de mes 2 variables supplémentaires
    ...  
    public void affichage() {
   
       super.affichage();
       system.out.print("Voiture : "+voiture+'\n'+"Chiffre    
d'affaire realise : "+ca);  
  }
 
Dans ma classe main :
j'instancie un commercial,
 
Commercial com = new Commercial("Trois",...,100000.00,"306D" );
 
j'appele la méthode affichage de la classe fille,
 
com.affichage()
 
MAIS seulement les attributs hérités sont affichés ???
N'y comprend rien
J'ai pourtant un cas identique dans un autre prog ou tout va bene  
 
Si une âme avertie voulait venir en aide au pauvre de moi  
Je sombre peu à peu dans le désespoir

Reply

Marsh Posté le 18-03-2002 à 22:19:16   

Reply

Marsh Posté le 18-03-2002 à 22:25:11    

Redefinition signifie bien "nouvelle definition"... pas "ajout a l'ancienne definition" le comportement que tu cites est normal.

Reply

Marsh Posté le 18-03-2002 à 22:45:01    

Non parceque dans ce cas la, seulement les attributs de la classe fille, Commercial, devraient être affcihés.
Hors ce sont les attributs de la classe mère qui sont affichés.
Il y'a bien appel de la méthode parente.
 
En fait il me semble que dans ce cas la réfinition, les pros le confirmeront, est en fait du polymorphisme car les args de la méthode ne changent pas, y'en a pas.

Reply

Marsh Posté le 18-03-2002 à 23:17:05    

Desole, je n'avais pas lu (ca m'apprendra tiens...)

Reply

Marsh Posté le 18-03-2002 à 23:24:47    

Ah oui pour le polymorphisme : si tu utilises une instance de Commercial en tant qu'instance d'Employe (Employe e = new Commercial()), et que tu fais un appel sur une methode redefinie apr la classe Commercial (p.ex. affichage()) tu vas appeler le corps de la methode de la classe commercial et pas employe et ceci meme si tu fais e.affichage()... le mapping est automatique.
 
Un exemple simple : les animaux... Tous les animaux crient, les chats et les chiens sont des animaux, le chien aboie, le chat miaule... Si tu prends un animal qui est un chien si tu le fais crier il aboiera meme si tu ne sais pas que c'est un chien, pareil pour le chat : il miaulera, il te suffit juste de savoir qu'un animal ca peut crier.
 
Par contre pour ton probleme je ne suis pas suffisamment reveille  pour te repondre, mais il me semble bizarre... paste eventuellement le code qui pose probleme.

 

[jfdsdjhfuetppo]--Message édité par Kahyman--[/jfdsdjhfuetppo]

Reply

Marsh Posté le 18-03-2002 à 23:55:27    

Je n'utilise pas une instance de Commercial en tant qu'Employe mais seulement une instance de Commercial qui hérite d'Employe, ses attributs et ses méthodes.      
Afin d'économiser du code, je redéfini la méthode affichage(), dans Commercial en appelant le code commun("crier" ) de ma méthode affichage parente par :
super.affichage()  
auquel j'ajoute l'affichage des attributs spécifique("Miaulement" ) à Commercial.  
 
Je suis entièrement daccord avec ton exemple. C'est bien ce que j'implémente en généralisant que tous les animaux "crient"(tout du - certains) et en spécifiant que le cri du chat est un miaulement et que le cri du chien est un aboiement.

Reply

Marsh Posté le 18-03-2002 à 23:59:20    

c ptet un pb de buffer sur la sortie standard
essaye de faire un system.out.println("" ) juste apres
 
(j'dis ca, mais c sans conviction)

Reply

Marsh Posté le 19-03-2002 à 19:57:40    

J'ai essayé mais rien à faire, il est décidément aussi obstiné que moi.
Pas d'autres idées ??

Reply

Marsh Posté le 19-03-2002 à 21:22:27    

Kahyman a écrit a écrit :

 
... paste eventuellement le code qui pose probleme.  




 
Alors il est ou ce code incrimine ?

Reply

Marsh Posté le 19-03-2002 à 22:02:11    

C'est pas vraiment le pied de poster du code sur ce forum, tu l'auras voulu.  
Je sens que ça être le bordel :-(
C'est brut de décoffrage  
Classe parente, Employe :
On considéra date_embauche OK, elle renvoie une date et je pense pas que ça déconne à ce niveau    
 
package societe.donnees;
 
public class Employe implements java.io.Serializable {
 
 String nom;
 String prenom;
 String adresse;
 String tel;
 String n_secu;
 String agence;
 EmpDate date_embauche;
 int matricule;
   
 public Employe(String nom,String prenom,String adresse,String tel,String n_secu,
       String agence,EmpDate date_embauche,int matricule){
   
  this.nom = nom;
  this.prenom = prenom;
  this.adresse = adresse;
  this.tel = tel;
  this.n_secu = n_secu;
  this.agence = agence;
  this.date_embauche = date_embauche;
  this.matricule = matricule;
 }
   
 public Employe(String nom,String prenom,String adresse,String tel,String n_secu,
       String agence,int jour,int mois,int annee,int matricule)
 {
  this.nom = nom;  
  this.prenom = prenom;
  this.adresse = adresse;
  this.tel = tel;
  this.n_secu = n_secu;
  this.agence = agence;
  date_embauche = new EmpDate(jour,mois,annee);
  this.matricule = matricule;
 }
         
 public void affichage() {
   
  System.out.print(prenom+" "+nom+'\n'
     +"Domicile    : "+adresse+'\n'
     +"Tél.        : "+tel+'\n'
     +"N° de sécun : "+n_secu+'\n'
     +"Matricule   : "+matricule+'\n'
     +"Agence      : "+agence+'\n'
     +"Embauche le : " );
   
  date_embauche.affichage();
 }
}
 
Classe fille, Commercial :
 
package societe.donnees;
 
public class Commercial extends Employe {
 
 double ca;
 String voiture;
 
 public Commercial(String nom,String prenom,String adresse,String tel,String n_secu,
          String agence,EmpDate date_embauche,int matricule,double ca,
          String voiture)
 {
  /* Voir si possibilité de simplifier le constructor */  
  super(nom,prenom,adresse,tel,n_secu,agence,date_embauche,matricule);  
  this.ca = ca;
  this.voiture = voiture;      
 }
   
 public Commercial(String nom,String prenom,String adresse,String tel,String n_secu,
          String agence,int jour,int mois,int annee,int matricule,double ca,
          String voiture)
 {
  super(nom,prenom,adresse,tel,n_secu,agence,jour,mois,annee,matricule);
  this.ca = ca;
  this.voiture = voiture;
 }
 
 public void affichage() {
   
  super.affichage();
  System.out.println("Voiture : "+voiture+'\n'+"Chiffre d'affaire realise : "+ca);  
 }
}
   
Classe principale, Societe :  
J'ai fait un peu de ménage,
 
import societe.donnees.*;
import societe.stockage.*;
import java.util.*;
import java.io.*;
 
 
public class Societe {
   
 public static void test() {
       
  /* Création objets */
  /*Employe emp = new Employe("Premier","Jean Paul","Vatican","00-11-22-33-44",
            "012345678","Lyon",1,1,2002,1);
   
  EmpDate d = new EmpDate("16/03/02" );
  Employe emp1 = new Employe("Deux","Jean Paul","Vatican","00-11-22-33-44",
            "012345678","Lyon",d,2);*/
 
  EmpDate d = new EmpDate("16/03/02" );
  Commercial com = new Commercial("Trois","Jean Paul","Vatican","00-11-22-33-44",
            "012345678","Lyon",d,3,100000.00,"306D" );
 
  Developpeur dev = new Developpeur("Du Pointeur","Jean Paul","Vatican","00-11-22-33-44",
            "012345678","Lyon",d,4,"C","Linux" );
   
  com.affichage();
  }
 
 public static void main(String args[]) {    
     
    System.out.println("args.length : "+args.length);
 
  if(args.length > 0)  
  {
   
   int i = Integer.parseInt(args[0]);
     
    switch(i)  
    {
     case 1 : test();
     
   }
  }
 }
 
}
 
Résultat dans lequel il manque "voiture : 306D" et "CA realise : 100000.00"
 
args.length : 1
Jean Paul Trois
Domicile    : Vatican
Tél.        : 00-11-22-33-44
N° de sécun : 012345678
Matricule   : 3
Agence      : Lyon
Embauche le : 16 Février 2
 
Process completed.

 

[jfdsdjhfuetppo]--Message édité par Pschitt--[/jfdsdjhfuetppo]

Reply

Marsh Posté le 19-03-2002 à 22:02:11   

Reply

Marsh Posté le 19-03-2002 à 22:06:17    

Bon bein dans l'ensemble c'est pas mal

Reply

Marsh Posté le 19-03-2002 à 22:25:03    

Et si t'inverses ?

Code :
  1. public void affichage() {
  2.   System.out.println("Voiture : "+voiture+'\n'+"Chiffre d'affaire realise : "+ca);
  3.   super.affichage(); 
  4. }

 

[jfdsdjhfuetppo]--Message édité par Verdoux--[/jfdsdjhfuetppo]

Reply

Marsh Posté le 19-03-2002 à 23:02:12    

Je viens juste de tester et même résultat. En fait j'ai l'impression qu'il ignore complétement la redéfinition car je peux coder n'importe quoi dans affichage() de Commercial sans qu'il change quoi que ce soit !  
 
Sinon je compile et execute avec Jcreator mais je vais essayer \dos.

Reply

Marsh Posté le 19-03-2002 à 23:02:44    

je comprend pas ton problème .... ca devrait marcher...
je vais copier ton code et essayer de voir ce qui marche pas.


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 19-03-2002 à 23:08:04    

Il manque la classe EmpDate que je peux éventuellement te passer.
 
Merci

Reply

Marsh Posté le 19-03-2002 à 23:09:25    

oui paste la stp

Reply

Marsh Posté le 19-03-2002 à 23:12:37    

ben écoute, après avoir épuré ton code (EmpDate et Developpeur inconnus au bataillon;)), j'ai testé et ca marche très bien :  
 

Citation :

java Societe
 
Jean Paul Trois
Domicile    : Vatican
Tél.        : 00-11-22-33-44
N° de sécun : 012345678
Matricule   : 3
Agence      : Lyon
Embauche le : 16/03/02
Voiture : 306D
Chiffre d'affaire realise : 100000.0


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 19-03-2002 à 23:19:11    

je confirme, ca marche tres bien

Reply

Marsh Posté le 19-03-2002 à 23:21:51    

benou a écrit a écrit :

je comprend pas ton problème .... ca devrait marcher...
je vais copier ton code et essayer de voir ce qui marche pas.  




 
Pareil, je ne vois pas le probleme chez moi ca marche sans EmpDate...  
 
Dis voir tu es sur d'avoir vire tes fichiers class et d'avoir recompile ton projet ?

Reply

Marsh Posté le 19-03-2002 à 23:22:53    

Mille sabords ???
Tu compiles et execute avec quoi ?

Reply

Marsh Posté le 19-03-2002 à 23:32:45    

jdk 1.4 pour moi

Reply

Marsh Posté le 19-03-2002 à 23:38:27    

jdk 1.3 pour moi.
 
Mais le problème est pas là. C'est forcément une erreur à la con.
 
Pschitt >> essaye de lancer le code qui tu nous as envoyé (dans un autre rep), je parie que ca marche ! ;)


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 19-03-2002 à 23:39:03    

Mais bordel je vais le brûler vivant ce maudit JCreator.  
 
En effet après avoir viré toutes mes classes et recompilé tout va bene.
Je pensais que cet éditeur écrasait correctement les anciens *.class par les nouveaux mais il doit perdre les pédales de tps en tps ?
 
Bon ben d'1 air tout penaud je vous dis, désolé de vous avoir fait perdre votre temps !
Mais je me rattraperais, je vous le jure    
 
Maudit créateur de JCréator, Créature du diable, tu vas brûler en enfer !!    
       
Tchao et Merci à tous

Reply

Marsh Posté le 19-03-2002 à 23:42:18    

de rien, ca arrive ...
 
(je savais bien que c'était une erreur à la con ;) )
 
mais c'est aussi pour ca que je déteste JBuilder et tout ces environnements hyper chiadés ... T'arrives pas à voir ce qu'ils font réellement.
 
:love: emacs + JDE :love:


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 19-03-2002 à 23:43:50    

Pschitt a écrit a écrit :

Mais bordel je vais le brûler vivant ce maudit JCreator.  
 
Je pensais que cet éditeur écrasait correctement les anciens *.class par les nouveaux mais il doit perdre les pédales de tps en tps ?
 
Tchao et Merci à tous  




 
Erf... bon tu as donc appris le premier bon reflexe a avoir : delete manuel des .class ou un rebuild de temps a autre :)
 
find /projectroot/ -name "*.class" -print | xargs rm
find /projectroot/ -name "*.java" -print | xargs javac
 
ces deux commandes sont tes amies... Ah euh zut tu es sous windows :lol:

Reply

Marsh Posté le 19-03-2002 à 23:47:35    

benou a écrit a écrit :

 
mais c'est aussi pour ca que je déteste JBuilder et tout ces environnements hyper chiadés ... T'arrives pas à voir ce qu'ils font réellement.




 
Mouais... JBuilder on peut lui reprocher pas mal de trucs mais pas ca : c'est hyper clean question gestion des projets, (re)building, etc... La majorite de ses defauts est corrigee par des addins, sauf un seul : le poids.
 
C'est ce qui me fait utiliser (x)emacs aussi, mais c'est bien la seule raison avec mon habitude a utiliser mon (x)emacs prefere.
 
D'ailleurs comparer JBuilder avec JCreator est un peu gonfle a mon gout :)

Reply

Marsh Posté le 19-03-2002 à 23:52:11    

je sais pas : je connais pas JCreator ...
 
Jbuilder j'ai essayé de m'y mettre plusieurs fois et j'ai vraiment du mal !  
Et pour la recompile, y a des fois où je suis obligé de faire bouton-de-droite/Compiler sur une classe pour que ca la compile, sinon il ne le fait pas quand je clique simplement sur compiler le projet.
J'imagine que c'est à cause d'un truc que je fais mal, mais je vois vraiment pas quoi : c'est un truc de base de compiler un projet, et y a un bouton expres pour ... :??:


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 19-03-2002 à 23:57:21    

OK ça roule, je retiens la leçon
 
Je me suis un peu emporté sur JCreator. J'ai pas une grande expérience de java et des divers éditeurs mais je trouve JCreator quand  même bien foutu, rapide et gratos surtout.
Concernant mon pb il est clair que je n'ai pas encore les bons reflexs mais à force de temps perdu ça devrait rentrer.    
 
Sinon Unix\Linux je connais un peu du boulot et j'y songe de + en + pour chez moi.  
     
Encore merci à vous

Reply

Marsh Posté le 20-03-2002 à 00:19:09    

benou a écrit a écrit :

J'imagine que c'est à cause d'un truc que je fais mal, mais je vois vraiment pas quoi : c'est un truc de base de compiler un projet, et y a un bouton expres pour ... :??:  




 
Tu as du oublier d'ajouter ta classe a ton projet : une classe editee ne fait pas forcement partie de ton projet, il faut l'ajouter explicitement a celui-ci pour qu'elle soit compilee au prochain rebuild.

Reply

Marsh Posté le 20-03-2002 à 00:21:11    

bha si on la voit dans l'arborécense de gauche, c'est qu'elle est ajouté au projet nan ?


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 20-03-2002 à 00:24:05    

non : tu peux ouvrir un fichier sans l'ajouter et il sera aussi dans l'arborescence (mais seul).
 
Si tu veux ajouter un fichier au projet il faut faire un "add to project" et non pas un "open".

Reply

Marsh Posté le 20-03-2002 à 08:50:11    

ben moi il était pas seul du tout : il était au milieu des autres classes du projet ... comprend pas.
 
En plus j'avais mis un moment à capter que ca marchait pas parce que la classe était pas recompilée !! je me souviens avoir copieusement insulté JBuilder quand j'ai compris le problème :)


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 20-03-2002 à 10:14:22    

benou a écrit a écrit :

ben moi il était pas seul du tout : il était au milieu des autres classes du projet ... comprend pas.
 
En plus j'avais mis un moment à capter que ca marchait pas parce que la classe était pas recompilée !! je me souviens avoir copieusement insulté JBuilder quand j'ai compris le problème :)  




 
Il est seul (pas dans un package) mais parmis les autres fichiers :) Je sais c'est deroutant si on fait une mauvaise manip et on pense avoir ajouter le fichier au projet, mais ceci permet d'ouvrir d'autres fichiers sans forcement les inclure (juste pour les consulter p.ex.)
 
Au niveau ergonomique c'est discutable oui (bien qu'a partir de JB5 les fichiers ne faisant pas partie du projet (package) sont a la racine de l'arborescence sans etre inclus dans un petit paquet cadeau (ceux qui connaissent JB me comprennent :D ) mais comme avec tout IDE il faut s'habituer :)

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed