Instanciation dynamique d'un attribut d'une classe

Instanciation dynamique d'un attribut d'une classe - Java - Programmation

Marsh Posté le 18-08-2009 à 13:49:38    

Bonjour,
 
Mon titre n'est peut être pas trés clair :s
En fait j'aurais besoin, à l'instanciation d'une classe, suivant les paramètres passés par l'utilisateur, de changer un attribut d'une classe...

Code :
  1. Classe Exemple{
  2.       private Attribut attribut;
  3.       public void init(String str){
  4.             if(str=="A" ){
  5.                     attribut = new AttributA();
  6.             }
  7.              else {
  8.                     attribut = new AttributB();
  9.            }
  10. }


Avec les classes (implémentant ou héritant de la Classe Attribut):

Code :
  1. Classe AttributA{
  2.          private String champA;
  3.          public void methodA();
  4.          //....
  5. }
  6. Classe AttributB{
  7.         private String champB1;
  8.         private String champB2;
  9.        public void methodB();
  10. }


 
Les méthodes et champs dans les classes Attributs A et B complètements différentes.
J'aimerai que l'utilisateur , si il passe le paramètre A dans l'initialisation, il n'est accès que aux méthodes de AttributA...  
 
J'ai pas trouvé réponse à mon problème pour l'instant, donc j'aimerai savoir si c'est possible :)
 
Merci

Reply

Marsh Posté le 18-08-2009 à 13:49:38   

Reply

Marsh Posté le 18-08-2009 à 14:00:57    

Et c'est quoi le problème avec ton 1er code ?

Reply

Marsh Posté le 18-08-2009 à 14:07:15    

Dans mon main, comme les classes AttributA et B implémentent l'interface Attribut(qui regroupe toutes les méthodes déclarées dans AttributA et B), qund je déclare un object de type Attribut, j'ai accées aux méthodes de AttributA et B, or je ne veut avoir accès qu'à une seule partie....

Reply

Marsh Posté le 18-08-2009 à 14:27:40    

Comment tu peux avoir accès aux méthodes de B si t'as instancié un A ?  :??:

Reply

Marsh Posté le 18-08-2009 à 14:33:24    

oué..... c'est pas possible, je viens de m'en rendre compte. Mais ce que je voulais c'est instancier un A et avoir accés seulement aux méthodes de A. En gros j'ai fait de la délégation... vais me débrouiller autrement
merci

Reply

Marsh Posté le 18-08-2009 à 15:21:36    

C'est ça non : http://en.wikipedia.org/wiki/Delegation_pattern ?
C'est ce que tu veux ou ce que tu veux pas ?

 

Et c'est quoi le contexte de ton problème ?


Message édité par Deamon le 18-08-2009 à 15:22:41
Reply

Marsh Posté le 18-08-2009 à 15:52:03    

oué c'est comme ça que j'ai fait en fait...
Suivant le "Complex Java example", je voulais que suivant le main() :  

Code :
  1. C c = new C();
  2. c.f();     // output: A: doing f()
  3. c.g();     // output: A: doing g()


jussque là nikel, mais quand tu fais appel à

Code :
  1. c.toB();


la suite devienne :

Code :
  1. c.anotherMethod();     // output: B: doing anotherMethod(), qui ne s'appelle plus f() du coup
  2. c.g();     // output: B: doing g()


J'ai un peu de mal à expliquer, mais de toute façon ce n'est pas possible... J'ai aussi vu du coté Decorator mais ça ne me convient pas non plus.
 
En fait il me faudrait, avant la compilation savoir quel méthode l'utilisateur va appeller :pt1cable: tout simplement impossible...  
Un peu plus de réflexion et de bon sens ne me fera pas de mal la prochaine fois... avant de poser des questions débiles... :pfff:  mais bon des fois quand tu as la tête trop dans le code... :)
 
merci à toi

Reply

Marsh Posté le 19-08-2009 à 09:58:47    

la vraie question c'est "pourquoi ?".
 
c'est quoi le but de ce que tu veux faire ? c'est quoi le fonctionnel ?


---------------
HFR - Mes sujets pour Chrome - Firefox - vérifie les nouveaux posts des topics suivis/favoris
Reply

Marsh Posté le 19-08-2009 à 10:46:44    

brisssou a écrit :

la vraie question c'est "pourquoi ?".
 
c'est quoi le but de ce que tu veux faire ? c'est quoi le fonctionnel ?


 
En fait, je propose une sorte d'API pour une base de données biologique. Je fournit donc à l'utilisateur des objets pour qu'il puisse requéter cett Bdd.
Lors de l'initialisation, il doit choisir entre deux méthodes de recherches sur cette bdd. Je voulais donc un objet polymorphe qui puisse,  
selon la méthode de recherche choisie, avoir des attributs et des méthodes différentes. Je voyais pas trop comment faire, donc je me suis penché sur du décorator  
ou de la delegation. Mais cela me donnais un objet ayant les méthodes des deux méthodes différentes et m'obligais à lancer des exceptions dés que l'utilisateur tentais d'utiliser
une méthode non correspondante à sa méthode de recherche.
J'ai donc fait autrement, l'utilisateur appelle mon object par une méthode get() qui lui renvoie le bon object selon sa méthode
et je l'oblige caster selon la méthode choisie... Il se retrouve donc bien avec un objet avec les seules méthodes qui lui correspondent.
Je sais pas si je me fait bien comprendre, mais si t'as une idée je suis preneur. Le fait de l'obliger à caster l'object, je trouve pas ça trés beau....
En tout cas, ça fonctionne :)
Merci
 

Reply

Marsh Posté le 19-08-2009 à 11:09:41    

est-ce que t'es obligé de différentier à ce point tes Objets d'accès à la base ?
 
Les méthodes et leurs paramètres sont si éloignés que ça pour tes deux objets ?


---------------
HFR - Mes sujets pour Chrome - Firefox - vérifie les nouveaux posts des topics suivis/favoris
Reply

Marsh Posté le 19-08-2009 à 11:09:41   

Reply

Marsh Posté le 19-08-2009 à 11:21:42    

En fait, pour l'instant, il ne sont pas si éloignés que ça, et je pourrai m'en tirer avec de la décoration, mais une troisième méthode de recherche est en train d'être developpée avec de nouvelles relations dans la bdd,et sera complètement différentes des deux autres par contre... donc je pensais au problème avant qu'il arrive en quelque sorte...

Reply

Marsh Posté le 23-08-2009 à 21:56:22    

Et pourquoi ne pas avoir deux (trois) classes qui représentent les méthodes de recherche dans ta base de données, qui implémentent une interface qui contient les différentes méthodes style select ou autres je ne sais pas ce que tu veux proposer. De cette façon ton API n'aura qu'a proposer une méthode setSearchAlgorithm qui permettra à l'utilisateur de séléctionner celui qui lui fait envie.
 
Sinon tu peux utiliser les generics et passer la classe de rechercher désirée directement si vraiment tu veux absolument des classes avec des méthodes différentes.
 
As-tu vraiment un avantage à proposer des méthodes qui ont des noms et signatures différentes pour chacune de tes classes de recherche ?


---------------
Always wear a camera!
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed