Abstarct & static

Résolu
Signaler
Messages postés
991
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
29 août 2013
-
Messages postés
991
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
29 août 2013
-
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:

10 réponses

Messages postés
123
Date d'inscription
mardi 5 août 2003
Statut
Membre
Dernière intervention
26 août 2012
3
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);
}

public abstract void print(String s);

}

public class Ccmd extends Cext {

public void print(String s) {
System.out.println("<Ccmd.print> : " + s);
}


public static void main(String[] args) {
Ccmd x = new Ccmd();
}


}

public class Cgui extends Cext {

public void print(String s) {
//TextArea.append(s);<--- à utiliser
System.out.println("<Cgui.print> : " + s); //<---pour te montrer que ca marche ;)
}

public static void main(String args[]) {
Cgui x = new Cgui();
}


}

TESTS :

#> java Ccmd
objet quelconque crée
<Ccmd.print> : text envoye par l'objet quelconque


#> java Cgui
objet quelconque crée
<Cgui.print> : text envoye par l'objet quelconque



Voilà, si il y a toujours quelque chose qui ne va pas ou si tu as d'autres problèmes, tu peux toujours demander...

@+
Messages postés
489
Date d'inscription
vendredi 30 janvier 2004
Statut
Membre
Dernière intervention
13 mai 2009
6
mais pourkoi ta declaré ta methode final!!!???
Messages postés
71
Date d'inscription
mercredi 14 avril 2004
Statut
Membre
Dernière intervention
14 septembre 2007

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é :/
Messages postés
991
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
29 août 2013
7
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.
Messages postés
123
Date d'inscription
mardi 5 août 2003
Statut
Membre
Dernière intervention
26 août 2012
3
Salut,
c'est ça que tu voulais ou j'ai pas très bien saisi encore ?

public abstract class Cext {


public abstract void print(String s);


public static void main(String[] args) {

Ccmd cc = new Ccmd();
cc.print("Je suis cc");

Cgui cg = new Cgui();
cg.print("Je suis cg");


Cext ce = new Ccmd();
ce.print("Je suis ce");

ce = new Cgui();
ce.print("Je suis ce");

}

}



public class Ccmd extends Cext {

public void print(String s) {
System.out.println("<Ccmd.print> : " + s);
}


}



public class Cgui extends Cext {

public void print(String s) {
//TextArea.append(s);<--- à utiliser
System.out.println("<Cgui.print> : " + s); //<---pour te montrer que ca marche ;)
}


}



// RESULTATS :


<Ccmd.print> : Je suis cc


<Cgui.print> : Je suis cg


<Ccmd.print> : Je suis ce


<Cgui.print> : Je suis ce

Si c'est pas vraiment ça que tu voulais faire, ré-explique un peu plus clairement alors stp ...sur un petit exemple par exemple....

@+
Messages postés
991
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
29 août 2013
7
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.



j'espere que je me suis bien expliké...
Messages postés
123
Date d'inscription
mardi 5 août 2003
Statut
Membre
Dernière intervention
26 août 2012
3
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 :

Dans classe Ccmd :
public Ccmd() {
super();
}

Dans classe Cgui :
public Cgui() {
super();
}

Voilà...ravi d'avoir pu t'aider...

@+

PS : J'adore ton avatar aussi...
Messages postés
991
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
29 août 2013
7
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 )
Messages postés
123
Date d'inscription
mardi 5 août 2003
Statut
Membre
Dernière intervention
26 août 2012
3
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.

Voilà @+

PS: Raté c'est Togepi !!!
Messages postés
991
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
29 août 2013
7
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 :)



Merci Togepi pour toute ton aide :p

Passe le bonjour a pikachu de la part de bob ;)