Comment définir l'objet que l'on utilise???

Résolu
samplaid
Messages postés
34
Date d'inscription
lundi 25 avril 2005
Statut
Membre
Dernière intervention
17 juillet 2008
- 14 févr. 2007 à 11:18
cs_DARKSIDIOUS
Messages postés
15814
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
- 14 févr. 2007 à 17:24
Bonjour,


J'ai commencé à faire un agenda et un repertoire dans une meme
application. J'aimerais faire un pnl de recherche commun pour les 2. Ma
question est celle-ci : est-il possible de construire mon panel sans
passer tout le tps par des if qui testeront le mode dans lequel je
suis.

Ex : if(mode == 'repertore') listbox.addItem('x');

       else listbox.addItem('x');


n'y a t'il pas un moyen par exemple de créé une méthode AddListBox dans
ma classe Rerpetoire et dans ma classe Agenda qui ferait un traitement
différent car n'on pas les 2 classes non pas la meme composition.

Et avec un seul 'if' définir l'objet que j'utilise??


Je ne sais pas si c'est claire pour vous, ce ne l'es pas pour moi  non plus


Merci de votre aide

7 réponses

samplaid
Messages postés
34
Date d'inscription
lundi 25 avril 2005
Statut
Membre
Dernière intervention
17 juillet 2008
1
14 févr. 2007 à 14:11
Operation a;

if (...)

a = new Plus();

else

a = new Moins();


ne marche pas non plus
3
cs_DARKSIDIOUS
Messages postés
15814
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
131
14 févr. 2007 à 12:10
Il te suffit de créer une hiérarchie de classe : une interface commune à tes types de comportements, et des classes concrètes pour remplir les fonctionnalités voulues, exemple :

Public Interface Operation {
public int Calcul(int x, int y);
}

Public class Plus implements Operation {
    public int Calcul(int x, int y) {
       return x + y;
    }
}

Public class Moins implements Operation {
    public int Calcul(int x, int y) {
       return x - y;
    }
}

Et ainsi dans tu stocke une instance de la classe à utiliser :
Operation op;

Et tu utilise la fonction Calcul là où t'en a besoin.

Cela est une sorte de pattern Strategy : un algorithme ayant plusieurs implémentations possible, et on utilise dynamiquement l'une ou l'autre implémentation.
0
samplaid
Messages postés
34
Date d'inscription
lundi 25 avril 2005
Statut
Membre
Dernière intervention
17 juillet 2008
1
14 févr. 2007 à 13:37
ok pour l'interface mais comment on fait pour l'appeler... car moi ca
dépend du mode dans lequel je suis pour l'utilisation de l'objet


if(frmMain.getMode() ==0) Plus a = new Plus();

else Moins a = new Moins();


a.calcul(15,63);


mais c'est syntaxiquement incorrect
0
cs_DARKSIDIOUS
Messages postés
15814
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
131
14 févr. 2007 à 13:43
Ce n'est pas :
Plus a = ...
ou
Moins a = ...

Mais :
Operation a;
if (...)
a = ...
else
a = ...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_DARKSIDIOUS
Messages postés
15814
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
131
14 févr. 2007 à 15:18
Bah cà devrait marcher, si les classes Plus et Moins implémentent bien l'interface Opération, les instances de ces classes peuvent avoir le type Opération sans problème.

Qu'est-ce qui ne marche pas ? Message d'erreur ?
0
samplaid
Messages postés
34
Date d'inscription
lundi 25 avril 2005
Statut
Membre
Dernière intervention
17 juillet 2008
1
14 févr. 2007 à 15:41
Ca marche, j'ai adapté a mon code mais j'ai ceci comme message d'erreur.


        ComponentFilter common;

        if (frame.getMode() == 0) {

            common = new Agenda(frame);

        } else {

            common = new Repertoire(frame);

        }


      txtFilter.addKeyListener(new java.awt.event.KeyAdapter() {

            public void keyReleased(java.awt.event.KeyEvent evt) {

           
    common.textChanged(txtFilter.getText());  
   //erreur : Cannot refer to a non-final variable common
inside an inner class defined in a different method  

            }

        });
0
cs_DARKSIDIOUS
Messages postés
15814
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
131
14 févr. 2007 à 17:24
Normal, ta variable common, pour pouvoir être utilisée dans une classe interne (ce qui est le cas ici : une instance de la classe KeyAdapter interne à ta classe principale) doit être finale, c'est-à-dire qu'il ne soit pas possible de l'étendre.

Donc ca donne :

final ComponentFilter common;
        if (frame.getMode() == 0) {
            common = new Agenda(frame);
        } else {
            common = new Repertoire(frame);
        }

      txtFilter.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyReleased(java.awt.event.KeyEvent evt) {

                common.textChanged(txtFilter.getText());
            }
        });
0