Montre le code de ta méthode getSolver et reformule ta question, je ne comprends pas bien. Qu'est ce que te donne System.out.println(object.get_type()); ?
Montre le code de ta méthode getSolver et reformule ta question, je ne comprends pas bien. Qu'est ce que te donne System.out.println(object.get_type()); ?
Je ne sais pas de quel pattern factory tu parles. Moi je te parle des patterns du GoF (Gang of Four), le livre de référence sur le sujet.Envoyé par BainE
Pour plus de détails sur les patterns factory (et du GoF) regardes ces liens (attention, implémentations en C#) :
- http://www.dofactory.com/Patterns/PatternFactory.aspx
- http://www.dofactory.com/Patterns/PatternAbstract.aspx
- http://www.dofactory.com/Patterns/Patterns.aspx#list
Voila ma méthode getSolver
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 public class Factory { public Solver getSolver(String className) throws Exception { String classNametmp = "Atelier_logiciel_fatigue."+className; Class maClasse = Class.forName(classNametmp); if (Solver.class.isAssignableFrom(maClasse)) { return (Solver) maClasse.newInstance(); } return null; } }
le type est une donnée membre de chaque classe Solver, Simmetrix
get_type() renvoie Solver pour la classe Solver et Simmetrix pour la classe Simmetrix, c'est juste pour voir le type de l'objet que j'instancie.
Mais la j'instancie un objet de type Solver alors que j'ai mis le mot clés Simmetrix donc je devrais avoir un objet de type Simmetrix.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 public static void main(String[] args) throws Exception { System.out.println("start main"); /* Simmetrix simmetrix = new Simmetrix(); simmetrix.run();*/ Factory factory = new Factory(); Solver object = (Solver)factory.getSolver("Simmetrix"); System.out.println(object.get_type()); System.out.println("finish main"); }
J'espère que j'ai été clair ,
merci
Xavier
Remplace System.out.println(object.get_type()); par System.out.println(object.getClass()); et tu verras que ton objet est bien un objet de type Simmetrix.
oki dlemoing, le pattern strict ne fais pas ca, mais je suis pas sur que ce soit idiot, en tout ca merci pour le lien il me servira.
merci bcp à tout le monde,
je vais m'intéresser aux différences entre Java et C++ pour éviter certaines surprises et je vais m'intéresser aux gestions d'exception.
Bonne fin d'aprem à tout le monde,
Xavier
Désolé de t'avoir fait penser que je considérais comme idiot ce que tu proposais. C'est juste que j'ai tendance à considerer qu'on ne doit pas abuser de l'utilisation du "static".Envoyé par BainE
Les membres et méthodes statiques, bien qu'ayant leur utilité, ne sont pas toujours le gage d'une conception objet de qualité et ils ont rarement leur place dans les designs patterns.
Ce n'est pas pour rien si dans une factory les méthodes ne sont pas statiques, mais pour comprendre tout ca je te conseille le livre du GoF (existe aussi en francais).
nan je suis pa vexé![]()
je suis simplement parti de l idée que la factory est une classe dont la création d'instance est superflux, en effet une factory ne doit pas avoir beaucoup d attributs, et une fois crée et demandé une instance par un getter l instance est ramassé par le garbage collector. Il n'y a aucun interet de declaré plusieurs intance... Et je me basai sur mes souvenirs de cours...
houlalaenfin voila
pour rajouté une betise il me semblai meme qu'il faille declaré le constructeur de la factory en private...
Donc il va falloir que je revise dur !!!
Voila bonne apres midi a tous
etdlemoing
Lu
je reviens, car j'ai un petit pb;
public static void main(String[] args) throws Exception {
System.out.println("start main");
Factory factory = new Factory();
Solver object = (Solver)factory.getSolver("Simmetrix");
System.out.println(object.getClass());
object.run();
System.out.println("finish main");
}
quand j'appelle une méthode de la classe Simmetrix avec mon instance objet , j'ai le mess suivant :
cannot find symbol; symbol : method run(), location: class Atelier_logiciel_fatigue.Solver at line 89 (89:16)
Pourtant j'ai bien la méthode run() car Simmetrix implémente l'interface Runnable. Je comprends pas pourquoi il va chercher la méthode dans la class Solver .
merci
Xavier
Il faut que ta méthode run() soit définie dans la classe Solver (ou déclarée en tant que méthode abstraite pour être redéfinie dans les sous-classes, mais alors Solver devient une classe abstraite).
Par contre, à l'execution, ce sera bien la méthode run définie dans Simmetrix qui sera executée (polymorphisme oblige).
OK, mais alors toutes les méthodes que je veux coder dans des classes dérivées doivent être mise dans la classe de base comme abstract méthode.
En C++, on peut faire ca, ajouter des méthodes dans des classes dérivées et qui ne sont pas déclarées dans la classe de base, il suffit juste de faire un dynamic_cast pour forcer le type et ainsi appeler la méthode.
Ca permet d'avoir une classe de base avec toutes les méthodes qui sont communes à l'ensemble des classes dérivées et de préciser le comportement des classes "filles" en ajoutant des méthodes...
Merci
Xavier
Tu peux également forcer le type si tu connais l'interface à utiliser :
ou directement :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Solver obj = factory.getSolver(...); ((Runnable)obj).run();
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Runnable obj = (Runnable)factory.getSolver(...); obj.run();
Apparte : je suis desole mais les exceptions ca existe depuis longtemps en C++ et a ca ete finallement standardise entre '94 et '96 (pask'avant chacun faisait a sa sauce). Outre les exceptions propres a chacun des vendeurs (ex: CException dans MFC) il existe std::exception de base dans ISO C++.
La grosse diff c'est qu'en C++on peut faire un throw de n'importe quoi (un int, un pointeur, une ref, un objet quelconque, ...) ce qui rend difficile la gestion des erreurs. Bien qu'on puisse faire un :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 #include <exception> class MonException1 : public std::exception { . . . }; class MaClasse { public: . . . void moOp() throw (MonException1, MonException2); . . . }; void MaClasse::monOp() throw (MonException1, MonException2) { . . . if (testErreur) { throw MonException1("Ca plante paske"); } . . . } try { monInstance.monOp(); } catch (MonException1& e1) { std::cout << "ERREUR : " << e1.what() << std::endl; }
Egalement il n'existe pas de bloc finally.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 try { . . . } catch (...) { // Oui il faut bien ecrire 3 points d'affilee. // Traitement de l'erreur. // Note : avec "..." impossible de savoir ce qui a ete catche). throw; // relancement eventuel de l'erreur. }
En Java on ne peut lancer que des Throwable et classe heritee comme Exception et on dipose d'un bloc finally toujours execute (si ca marche ou si ca plante).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 try { . . . } catch (Throwable t) { // Traitement de l'erreur. throw t; // relancement eventuel de l'erreur. } finally { // Traitement qui est tout le temps effectue. }
Merci de penser au tagquand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.
suivez mon blog sur Développez.
Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook
Partager