Guillemouze
Messages postés991Date d'inscriptionsamedi 25 octobre 2003StatutMembreDernière intervention29 août 2013
-
30 juil. 2005 à 20:13
Guillemouze
Messages postés991Date d'inscriptionsamedi 25 octobre 2003StatutMembreDernière intervention29 août 2013
-
3 août 2005 à 23:07
Bonjour,
alors voila mon probleme:
jai une classe C, et deux sous-classe Cext1 Cext2 (Cext1 (resp. Cext2) extends C).
Dans la classe Cext, j'ai mon main qui cree une instance Cext.
Et dans les classe Cext, j'ai une methode M qui a une action differente selon que ce soit celle de Cext1 ou Cext2.
La methode M est declaree aussi dans la classe C.
Je voudrais pouvoir appeler la methode M a partir d'une autre classe, en static sur la classe C, et que celui ci appele la methode M de la classe Cext1 ou Cext2 selon celle qui a ete instanciee.
En gros, voila a quoi ca ressemble, mais ca marche pas, seule la methode de la classe C est appelee :
public abstarct class C {
public final void M() {
System.out.println("<C.M>");
}
}
public class Cext1 extends C {
public final void M() {
System.out.println("<Cext1.M>");
}
public static void main(String args[]) {
Cext1 c = new Cext1();
}
}
public class Cext2 extends C {
public final void M() {
System.out.println("<Cext2.M>");
}
public static void main(String args[]) {
Cext2 c = new Cext2();
}
}
et dans une autre classe, j'ai
C.M();
et peu importe que je lance java Cext1 ou java Cext2, l'appel de C.M() renvoie toujours <C.M>
Merci (si vous avez compris )
A voir également:
Error: main method not found in the file, please define the main method as: public static void main(string[] args)
Madvin
Messages postés123Date d'inscriptionmardi 5 août 2003StatutMembreDernière intervention26 août 20123 2 août 2005 à 19:11
Bon ben je pense que maintenant c'est ce que tu voulais...y a peut-être des solutions plus élégantes mais comme je sais pas vraiment la façon dont tu veux te servir de ce code, je peux pas trop te dire...
public class ObjetQuelconque {
public ObjetQuelconque(Cext c) {
System.out.println("objet quelconque crée");
c.print("text envoye par l'objet quelconque");
}
}
public abstract class Cext {
protected ObjetQuelconque obj;
public Cext() {
obj = new ObjetQuelconque(this);
}
Bel0
Messages postés71Date d'inscriptionmercredi 14 avril 2004StatutMembreDernière intervention14 septembre 2007 31 juil. 2005 à 14:46
Premièrement, on dirait que tu utilises mal final. Pour les méthodes, quand ce mot clé est utilisé avec la méthode M (pour reprendre ton exemple), cela empêche la méthode d'être redéfinie dans des sous-classes. Il est donc tout à fait normal que ton output soit <C.M> dans tous les cas.
En ce qui concerne ton problème. Si j'ai bien compris ce que tu voulais faire, c'est exécuté une partie de code "générale" pour toutes les sous-classes et une partie de code particulière à chaque sous-classes. Le moyen le plus simple de le faire est d'appeler la méthode générale au début de chaque méthode particulière. Pour chaque méthode M dans les classes-étendues, tu dois donc rajouter l'appel suivant: super.M();
Dsl, pour le post précédent, je sais pas ce qu'il s'est passé :/
Guillemouze
Messages postés991Date d'inscriptionsamedi 25 octobre 2003StatutMembreDernière intervention29 août 20136 31 juil. 2005 à 21:21
heu oue desole jme suis trompe, c pas final mais static.
en fait, je sais que j'ai un objet Cext, mais je sais pas lequel, et je
voudrais appeler la methode M a partir d'une autre classe qui ne sait
pas quel objet Cext est instancié. c'est pour ca que je voudrais faire
appel a la methode M sur la classe C, et que ce soit la methode de
l'objet instancie par le main qui soit utilisee.
Pour etre plus precis, mes classes Cext sont en fait les classes Ccmd
et Cgui, et la methode M est la fonction print. dans la classe Ccmd, la
mathode print vaut System.out.print, et dans la methode Cgui, la
methode print vaut TextArea.append. les classes qui font appel a la
methode print sont des classes instanciees dans la classe C, ou dans
des classes instanciees dans les classes instanciees dans C, etc....
Le probleme est que j'ai pas de classe commune entre le System.out et
le TextArea, pour definir une variable dans la classe C qui
correspondrait aux 2.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Guillemouze
Messages postés991Date d'inscriptionsamedi 25 octobre 2003StatutMembreDernière intervention29 août 20136 2 août 2005 à 16:32
non c pas tout a fait ca :-$
voila ce qu je veux :
public abstract class C {
ObjetQuelconque obj;
public C() {
obj = new ObjetQuelconque();
}
public ??? void print(String s) {
//rien, juste la declaration pour forcer lexistance ds la sous classe
}
}
public class ObjetQuelconque {
public ObjetQuelconque() {
System.out.println("objet quelconque crée");
C.print("text envoye par l'objet quelconque");
}
}
public class Ccmd extends C {
public Ccmd() {
super();
}
public static void print(String s) {
System.out.print("ccmd : " + s);
}
public static void main(String args[]) {
Ccmd x = new Ccmd();
}
}
public class Cgui extends C {
public Cgui() {
super();
}
public static void print(String s) {
//TextArea.append(s);
System.out.print("cgui : " + s);
}
public static void main(String args[]) {
Cgui x = new Cgui();
}
}
donc voila a koi devrait ressembler le code, mais je pense que mon
approche n'est pas bonne. ce quez je voudrais que ca fasse, c'est :
#> java Ccmd
objet quelconque crée
ccmd : text envoye par l'objet quelconque
#> java Cgui
objet quelconque crée
cgui : text envoye par l'objet quelconque
dc j'ai le choix entre lancer par ligne de commande ou par une
frame. et selon le cas, je veux que les messages des autres objets
crees soient envoyes soit par le system.out, soit dans un textarea de
la frame.
Madvin
Messages postés123Date d'inscriptionmardi 5 août 2003StatutMembreDernière intervention26 août 20123 3 août 2005 à 11:06
Euh....j'ai oublié les constructeurs pour Ccmd et Cgui, mais tu les avais déjà, et en plus le compilateur les prend par défaut de toute façon ....néanmoins il vaut mieux les spécifier :
Guillemouze
Messages postés991Date d'inscriptionsamedi 25 octobre 2003StatutMembreDernière intervention29 août 20136 3 août 2005 à 15:25
En fait ya juste un pb, enfin un truc qui va etre chiant mais ya pas le
choix, c kil va falloir que je passe mon Cext en parametre a tous les
objets que je créé (environ 10 classes) mais je vois pas d'autre
solution, ou en tout cas pas d'aussi simple.
En tout cas merci bcp Madvin
PS: stari est bien sympa aussi ;) (enfin si c bien lui )
Madvin
Messages postés123Date d'inscriptionmardi 5 août 2003StatutMembreDernière intervention26 août 20123 3 août 2005 à 21:42
Ben y a une autre solution, c'est d'utiliser le patron de conception Observateur/Observé.
En gros, ça consiste en la notification par l'observé aux observateurs d'une modification qui le concerne. Dans ton exemple, les observés sont les ObjetQuelconque, et les observateurs les instances de Cext (instances de ses sous-classes y compris).
Dans la bibliothèque de Sun tu as de quoi faire ça aisément : regarde l'interface Observer que doit implémenter tes observateurs, et la classe Observable qui doit être une super-classe d'ObjetQuelconque. Elles possèdent très peu de méthodes, tu pourras donc comprendre assez vite comment ca fonctionne.
C'est peut-être une méthode un peu plus lourde, mais côté architecture c'est le top.
Guillemouze
Messages postés991Date d'inscriptionsamedi 25 octobre 2003StatutMembreDernière intervention29 août 20136 3 août 2005 à 23:07
Non je pense pas que ce soit ca, paske ds ce cas la il faut quand meme
que je passe aux objets quelconques une references des observers
(Cext), ce qui revient a la solution que tu ma proposee, mais en plus
les objets Cext seront averti de tout changement des objets
quelconques, et ca je m'en fout (d'ailleurs qu'est-ce qu'un
"changement"???).
En tout cas je garde ces classes en tetes, ca peut etre bien util des fois :)