|
Dernière réponse | ||
---|---|---|
Sujet : [JAVA] Rédifinition méthode | ||
Kahyman |
|
Aperçu |
---|
Vue Rapide de la discussion |
---|
Kahyman |
|
benou | 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 :) |
Kahyman | 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". |
benou | bha si on la voit dans l'arborécense de gauche, c'est qu'elle est ajouté au projet nan ? |
Kahyman |
|
Pschitt | 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 |
benou | 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 ... :??: |
Kahyman |
|
Kahyman |
|
benou | 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: |
Pschitt | 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 |
benou | 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 ! ;) |
HappyHarry | jdk 1.4 pour moi |
Pschitt | Mille sabords ???
Tu compiles et execute avec quoi ? |
Kahyman |
|
HappyHarry | je confirme, ca marche tres bien |
benou | ben écoute, après avoir épuré ton code (EmpDate et Developpeur inconnus au bataillon;)), j'ai testé et ca marche très bien :
|
HappyHarry | oui paste la stp |
Pschitt | Il manque la classe EmpDate que je peux éventuellement te passer.
Merci |
benou | je comprend pas ton problème .... ca devrait marcher...
je vais copier ton code et essayer de voir ce qui marche pas. |
Pschitt | 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. |
verdoux | Et si t'inverses ?
[jfdsdjhfuetppo]--Message édité par Verdoux--[/jfdsdjhfuetppo] |
Pschitt | Bon bein dans l'ensemble c'est pas mal |
Pschitt | 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] |
Kahyman |
|
Pschitt | J'ai essayé mais rien à faire, il est décidément aussi obstiné que moi.
Pas d'autres idées ?? |
HappyHarry | 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) |
Pschitt | 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. |
Kahyman | 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] |
Kahyman | Desole, je n'avais pas lu (ca m'apprendra tiens...) |
Pschitt | 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. |
Kahyman | Redefinition signifie bien "nouvelle definition"... pas "ajout a l'ancienne definition" le comportement que tu cites est normal. |
Pschitt | 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 |