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

  FORUM HardWare.fr
  Programmation

  [JAVA] Rédifinition méthode

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[JAVA] Rédifinition méthode

n°113874
Pschitt
Posté le 18-03-2002 à 22:19:16  profilanswer
 

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

mood
Publicité
Posté le 18-03-2002 à 22:19:16  profilanswer
 

n°113876
Kahyman
Posté le 18-03-2002 à 22:25:11  profilanswer
 

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

n°113888
Pschitt
Posté le 18-03-2002 à 22:45:01  profilanswer
 

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.

n°113907
Kahyman
Posté le 18-03-2002 à 23:17:05  profilanswer
 

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

n°113912
Kahyman
Posté le 18-03-2002 à 23:24:47  profilanswer
 

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]

n°113932
Pschitt
Posté le 18-03-2002 à 23:55:27  profilanswer
 

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.

n°113933
HappyHarry
Posté le 18-03-2002 à 23:59:20  profilanswer
 

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)

n°114398
Pschitt
Posté le 19-03-2002 à 19:57:40  profilanswer
 

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

n°114438
Kahyman
Posté le 19-03-2002 à 21:22:27  profilanswer
 

Kahyman a écrit a écrit :

 
... paste eventuellement le code qui pose probleme.  




 
Alors il est ou ce code incrimine ?

n°114472
Pschitt
Posté le 19-03-2002 à 22:02:11  profilanswer
 

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]

mood
Publicité
Posté le 19-03-2002 à 22:02:11  profilanswer
 

n°114476
Pschitt
Posté le 19-03-2002 à 22:06:17  profilanswer
 

Bon bein dans l'ensemble c'est pas mal

n°114493
verdoux
And I'm still waiting
Posté le 19-03-2002 à 22:25:03  profilanswer
 

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]

n°114507
Pschitt
Posté le 19-03-2002 à 23:02:12  profilanswer
 

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.

n°114508
benou
Posté le 19-03-2002 à 23:02:44  profilanswer
 

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
n°114514
Pschitt
Posté le 19-03-2002 à 23:08:04  profilanswer
 

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

n°114516
HappyHarry
Posté le 19-03-2002 à 23:09:25  profilanswer
 

oui paste la stp

n°114517
benou
Posté le 19-03-2002 à 23:12:37  profilanswer
 

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
n°114522
HappyHarry
Posté le 19-03-2002 à 23:19:11  profilanswer
 

je confirme, ca marche tres bien

n°114526
Kahyman
Posté le 19-03-2002 à 23:21:51  profilanswer
 

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 ?

n°114527
Pschitt
Posté le 19-03-2002 à 23:22:53  profilanswer
 

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

n°114534
HappyHarry
Posté le 19-03-2002 à 23:32:45  profilanswer
 

jdk 1.4 pour moi

n°114541
benou
Posté le 19-03-2002 à 23:38:27  profilanswer
 

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
n°114542
Pschitt
Posté le 19-03-2002 à 23:39:03  profilanswer
 

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

n°114549
benou
Posté le 19-03-2002 à 23:42:18  profilanswer
 

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
n°114554
Kahyman
Posté le 19-03-2002 à 23:43:50  profilanswer
 

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:

n°114560
Kahyman
Posté le 19-03-2002 à 23:47:35  profilanswer
 

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 :)

n°114569
benou
Posté le 19-03-2002 à 23:52:11  profilanswer
 

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
n°114574
Pschitt
Posté le 19-03-2002 à 23:57:21  profilanswer
 

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

n°114595
Kahyman
Posté le 20-03-2002 à 00:19:09  profilanswer
 

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.

n°114597
benou
Posté le 20-03-2002 à 00:21:11  profilanswer
 

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
n°114601
Kahyman
Posté le 20-03-2002 à 00:24:05  profilanswer
 

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".

n°114656
benou
Posté le 20-03-2002 à 08:50:11  profilanswer
 

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
n°114718
Kahyman
Posté le 20-03-2002 à 10:14:22  profilanswer
 

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 :)

mood
Publicité
Posté le   profilanswer
 


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

  [JAVA] Rédifinition méthode

 

Sujets relatifs
Mes JButton et JLabel perdus dans ma fenêtre [Java]Editeur/Compilateur de Java
[JAVA]Tester une connexion oracle en javaQuel est la meilleure méthode de mise en place d'accès sécurisé...
Java: random number[JAVA] ResultSet : comment savoir le nombre de colonnes ?
[JAVA] Pb d'interface, mes composants se mettent n'importe comment[java] double buffering, comment je fais ?
[java] lancer un prog?[JAVA] Comment modifier les droits des applets ?
Plus de sujets relatifs à : [JAVA] Rédifinition méthode


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