A l'exception des méthodes qui surchargent equals(), tester la classe
d'un objet est presque toujours signe d'un défaut de conception.
En l'occurrence, une String et une Map n'ont pas le même contrat, il
semble donc extrêmement étrange de pouvoir les rencontrer dans une même
référence polymorphique.
Es-tu sûr que ta conception actuelle est satisfaisante ?
valeur de (PROCEDURE_NAME)
PROCEDURE_TYPE : valeur de (PROCEDURE_TYPE)
A l'exception des méthodes qui surchargent equals(), tester la classe
d'un objet est presque toujours signe d'un défaut de conception.
En l'occurrence, une String et une Map n'ont pas le même contrat, il
semble donc extrêmement étrange de pouvoir les rencontrer dans une même
référence polymorphique.
Es-tu sûr que ta conception actuelle est satisfaisante ?
valeur de (PROCEDURE_NAME)
PROCEDURE_TYPE : valeur de (PROCEDURE_TYPE)
A l'exception des méthodes qui surchargent equals(), tester la classe
d'un objet est presque toujours signe d'un défaut de conception.
En l'occurrence, une String et une Map n'ont pas le même contrat, il
semble donc extrêmement étrange de pouvoir les rencontrer dans une même
référence polymorphique.
Es-tu sûr que ta conception actuelle est satisfaisante ?
valeur de (PROCEDURE_NAME)
PROCEDURE_TYPE : valeur de (PROCEDURE_TYPE)
Thibaut,instanceof JTextField, instanceof JButton etc... Pour faire des
traitements différents...
Différents de quelle manière ?
Y'avait t'il une manière plus intelligente de procéder ?
Dans la mesure où tu n'as pas la main sur la hiérarchie de classes de
Swing, je n'en mettrais pas ma tête à couper. Normalement, tu remplaces
le test sur la classe par un appel polymorphique.
Dans ce cas précis, tu ne peux pas le faire directement. Il faut utiliser un Decorator (*), ou
alors changer complètement d'algorithme comme le suggère Rémy.
Lorsque tu examines la classe pour déterminer le bon comportement, le
problème que tu créées est le suivant: à chaque fois que tu veux prendre
en compte une nouvelle sous-classe de JComponent dans ta hiérarchie
(mettons que tu rajoutes à ton application un JAudioSampleButton qui te
permet de choisir un son, alors que tu n'en avais pas eu besoin jusqu'à
présent) tu dois ajouter un cas à ton test.
Il serait préférable que toutes les modifications nécessaires pour
prendre en compte un JAudioSampleButton soient contenues... dans
JAudioSampleButton, et pas ailleurs.
(*) Un exemple de Decorator pour la hiérarchie JComponent:
http://www.onjava.com/pub/a/onjava/2003/02/05/decorator.html
Laurent
http://bossavit.com/thoughts/
Thibaut,
instanceof JTextField, instanceof JButton etc... Pour faire des
traitements différents...
Différents de quelle manière ?
Y'avait t'il une manière plus intelligente de procéder ?
Dans la mesure où tu n'as pas la main sur la hiérarchie de classes de
Swing, je n'en mettrais pas ma tête à couper. Normalement, tu remplaces
le test sur la classe par un appel polymorphique.
Dans ce cas précis, tu ne peux pas le faire directement. Il faut utiliser un Decorator (*), ou
alors changer complètement d'algorithme comme le suggère Rémy.
Lorsque tu examines la classe pour déterminer le bon comportement, le
problème que tu créées est le suivant: à chaque fois que tu veux prendre
en compte une nouvelle sous-classe de JComponent dans ta hiérarchie
(mettons que tu rajoutes à ton application un JAudioSampleButton qui te
permet de choisir un son, alors que tu n'en avais pas eu besoin jusqu'à
présent) tu dois ajouter un cas à ton test.
Il serait préférable que toutes les modifications nécessaires pour
prendre en compte un JAudioSampleButton soient contenues... dans
JAudioSampleButton, et pas ailleurs.
(*) Un exemple de Decorator pour la hiérarchie JComponent:
http://www.onjava.com/pub/a/onjava/2003/02/05/decorator.html
Laurent
http://bossavit.com/thoughts/
Thibaut,instanceof JTextField, instanceof JButton etc... Pour faire des
traitements différents...
Différents de quelle manière ?
Y'avait t'il une manière plus intelligente de procéder ?
Dans la mesure où tu n'as pas la main sur la hiérarchie de classes de
Swing, je n'en mettrais pas ma tête à couper. Normalement, tu remplaces
le test sur la classe par un appel polymorphique.
Dans ce cas précis, tu ne peux pas le faire directement. Il faut utiliser un Decorator (*), ou
alors changer complètement d'algorithme comme le suggère Rémy.
Lorsque tu examines la classe pour déterminer le bon comportement, le
problème que tu créées est le suivant: à chaque fois que tu veux prendre
en compte une nouvelle sous-classe de JComponent dans ta hiérarchie
(mettons que tu rajoutes à ton application un JAudioSampleButton qui te
permet de choisir un son, alors que tu n'en avais pas eu besoin jusqu'à
présent) tu dois ajouter un cas à ton test.
Il serait préférable que toutes les modifications nécessaires pour
prendre en compte un JAudioSampleButton soient contenues... dans
JAudioSampleButton, et pas ailleurs.
(*) Un exemple de Decorator pour la hiérarchie JComponent:
http://www.onjava.com/pub/a/onjava/2003/02/05/decorator.html
Laurent
http://bossavit.com/thoughts/
Voila le pourquoi du test String ou pas car je dois savoir quand
j'ajoute au noeud procédure de mon arbre si j'ai affaire à une feuille
(String) ou à un autre noeud (HashMap) contenant lui-même des feuilles.
Voila le pourquoi du test String ou pas car je dois savoir quand
j'ajoute au noeud procédure de mon arbre si j'ai affaire à une feuille
(String) ou à un autre noeud (HashMap) contenant lui-même des feuilles.
Voila le pourquoi du test String ou pas car je dois savoir quand
j'ajoute au noeud procédure de mon arbre si j'ai affaire à une feuille
(String) ou à un autre noeud (HashMap) contenant lui-même des feuilles.
En conception Objet, on va typiquement chercher à représenter les
structures par des classes. On pourrait imaginer une classe Procedure
encapsulant une liste contenant des instances de ProcedureAttribute et
ProcedureColumn.
En conception Objet, on va typiquement chercher à représenter les
structures par des classes. On pourrait imaginer une classe Procedure
encapsulant une liste contenant des instances de ProcedureAttribute et
ProcedureColumn.
En conception Objet, on va typiquement chercher à représenter les
structures par des classes. On pourrait imaginer une classe Procedure
encapsulant une liste contenant des instances de ProcedureAttribute et
ProcedureColumn.
Laurent Bossavit wrote:Thibaut,instanceof JTextField, instanceof JButton etc... Pour faire des
traitements différents...
Différents de quelle manière ?
Ben par exemple quand j'appuie sur entrée sur un champ de saisie ca
passe le focus au champ suivant. Si je suis sur un bouton ca fait un
doClick(), si je suis sur une JComboBox ca valide le contenu etc...
En gros j'ai ça :
public void keyPressed(KeyEvent ek) {
if(ek.getKeyCode() == KeyEvent.VK_ENTER) {
if(ek.getSource() instanceof JTextArea) {
if(ek.isControlDown())
transfererLeFocus(ek);
}
en gros
else if(ek.getSource() instanceof JButton)
((JButton) ek.getSource()).doClick();
else if(ek.getSource() instanceof JComboBox) {
/* Valider le contenu */
transfererLeFocus(ek);
}
else /* Pour tous les autres composants */
transfererLeFocus(ek);
}
P.S: je connais FocusEvent et FocusListener, et je m'en sers d'ailleurs
dans d'autres parties du programme, mais pour faire ce traitement ci je
vois pas trop puisque justement le but est de passer le focus...Y'avait t'il une manière plus intelligente de procéder ?
Dans la mesure où tu n'as pas la main sur la hiérarchie de classes de
Swing, je n'en mettrais pas ma tête à couper. Normalement, tu remplaces
le test sur la classe par un appel polymorphique.
Hein ?? Désolé masi tu peux préciser s'il te plait ? J'avoue que j'ai
jamais vraiment étudié le polymorphisme alors c'est un mot qui me fait
encore peur... (Si ca se trouve je m'en suis déjà servi sans le savoir
:-p )
Dans ce cas précis, tu ne peux pas le faire directement. Il faut
utiliser un Decorator (*), ou
alors changer complètement d'algorithme comme le suggère Rémy.
Lorsque tu examines la classe pour déterminer le bon comportement, le
problème que tu créées est le suivant: à chaque fois que tu veux prendre
en compte une nouvelle sous-classe de JComponent dans ta hiérarchie
(mettons que tu rajoutes à ton application un JAudioSampleButton qui te
permet de choisir un son, alors que tu n'en avais pas eu besoin jusqu'à
présent) tu dois ajouter un cas à ton test.
Seulement si le traitement est un cas particulier. Sinon
JAudioSampleButton qui hérite de JButton fera son doClick() comme les
autres. Or, qui dit cas particulier dit de toutes façons du code à
rajouter.
Il serait préférable que toutes les modifications nécessaires pour
prendre en compte un JAudioSampleButton soient contenues... dans
JAudioSampleButton, et pas ailleurs.
Là je suis d'accord mais comment tu fais dans ce cas précis ? Tu mets le
code du KeyListener personnalisé dans chaque composant ? Ca veut dire
qu'il faut étendre tous les composants déjà existants et créer
MyJButton, MyJComboBox, MyJTextField etc ? je vois vraiment pas
l'interêt car ça fait encore plus de boulot...(*) Un exemple de Decorator pour la hiérarchie JComponent:
http://www.onjava.com/pub/a/onjava/2003/02/05/decorator.html
Laurent
http://bossavit.com/thoughts/
Thibaut
Laurent Bossavit wrote:
Thibaut,
instanceof JTextField, instanceof JButton etc... Pour faire des
traitements différents...
Différents de quelle manière ?
Ben par exemple quand j'appuie sur entrée sur un champ de saisie ca
passe le focus au champ suivant. Si je suis sur un bouton ca fait un
doClick(), si je suis sur une JComboBox ca valide le contenu etc...
En gros j'ai ça :
public void keyPressed(KeyEvent ek) {
if(ek.getKeyCode() == KeyEvent.VK_ENTER) {
if(ek.getSource() instanceof JTextArea) {
if(ek.isControlDown())
transfererLeFocus(ek);
}
en gros
else if(ek.getSource() instanceof JButton)
((JButton) ek.getSource()).doClick();
else if(ek.getSource() instanceof JComboBox) {
/* Valider le contenu */
transfererLeFocus(ek);
}
else /* Pour tous les autres composants */
transfererLeFocus(ek);
}
P.S: je connais FocusEvent et FocusListener, et je m'en sers d'ailleurs
dans d'autres parties du programme, mais pour faire ce traitement ci je
vois pas trop puisque justement le but est de passer le focus...
Y'avait t'il une manière plus intelligente de procéder ?
Dans la mesure où tu n'as pas la main sur la hiérarchie de classes de
Swing, je n'en mettrais pas ma tête à couper. Normalement, tu remplaces
le test sur la classe par un appel polymorphique.
Hein ?? Désolé masi tu peux préciser s'il te plait ? J'avoue que j'ai
jamais vraiment étudié le polymorphisme alors c'est un mot qui me fait
encore peur... (Si ca se trouve je m'en suis déjà servi sans le savoir
:-p )
Dans ce cas précis, tu ne peux pas le faire directement. Il faut
utiliser un Decorator (*), ou
alors changer complètement d'algorithme comme le suggère Rémy.
Lorsque tu examines la classe pour déterminer le bon comportement, le
problème que tu créées est le suivant: à chaque fois que tu veux prendre
en compte une nouvelle sous-classe de JComponent dans ta hiérarchie
(mettons que tu rajoutes à ton application un JAudioSampleButton qui te
permet de choisir un son, alors que tu n'en avais pas eu besoin jusqu'à
présent) tu dois ajouter un cas à ton test.
Seulement si le traitement est un cas particulier. Sinon
JAudioSampleButton qui hérite de JButton fera son doClick() comme les
autres. Or, qui dit cas particulier dit de toutes façons du code à
rajouter.
Il serait préférable que toutes les modifications nécessaires pour
prendre en compte un JAudioSampleButton soient contenues... dans
JAudioSampleButton, et pas ailleurs.
Là je suis d'accord mais comment tu fais dans ce cas précis ? Tu mets le
code du KeyListener personnalisé dans chaque composant ? Ca veut dire
qu'il faut étendre tous les composants déjà existants et créer
MyJButton, MyJComboBox, MyJTextField etc ? je vois vraiment pas
l'interêt car ça fait encore plus de boulot...
(*) Un exemple de Decorator pour la hiérarchie JComponent:
http://www.onjava.com/pub/a/onjava/2003/02/05/decorator.html
Laurent
http://bossavit.com/thoughts/
Thibaut
Laurent Bossavit wrote:Thibaut,instanceof JTextField, instanceof JButton etc... Pour faire des
traitements différents...
Différents de quelle manière ?
Ben par exemple quand j'appuie sur entrée sur un champ de saisie ca
passe le focus au champ suivant. Si je suis sur un bouton ca fait un
doClick(), si je suis sur une JComboBox ca valide le contenu etc...
En gros j'ai ça :
public void keyPressed(KeyEvent ek) {
if(ek.getKeyCode() == KeyEvent.VK_ENTER) {
if(ek.getSource() instanceof JTextArea) {
if(ek.isControlDown())
transfererLeFocus(ek);
}
en gros
else if(ek.getSource() instanceof JButton)
((JButton) ek.getSource()).doClick();
else if(ek.getSource() instanceof JComboBox) {
/* Valider le contenu */
transfererLeFocus(ek);
}
else /* Pour tous les autres composants */
transfererLeFocus(ek);
}
P.S: je connais FocusEvent et FocusListener, et je m'en sers d'ailleurs
dans d'autres parties du programme, mais pour faire ce traitement ci je
vois pas trop puisque justement le but est de passer le focus...Y'avait t'il une manière plus intelligente de procéder ?
Dans la mesure où tu n'as pas la main sur la hiérarchie de classes de
Swing, je n'en mettrais pas ma tête à couper. Normalement, tu remplaces
le test sur la classe par un appel polymorphique.
Hein ?? Désolé masi tu peux préciser s'il te plait ? J'avoue que j'ai
jamais vraiment étudié le polymorphisme alors c'est un mot qui me fait
encore peur... (Si ca se trouve je m'en suis déjà servi sans le savoir
:-p )
Dans ce cas précis, tu ne peux pas le faire directement. Il faut
utiliser un Decorator (*), ou
alors changer complètement d'algorithme comme le suggère Rémy.
Lorsque tu examines la classe pour déterminer le bon comportement, le
problème que tu créées est le suivant: à chaque fois que tu veux prendre
en compte une nouvelle sous-classe de JComponent dans ta hiérarchie
(mettons que tu rajoutes à ton application un JAudioSampleButton qui te
permet de choisir un son, alors que tu n'en avais pas eu besoin jusqu'à
présent) tu dois ajouter un cas à ton test.
Seulement si le traitement est un cas particulier. Sinon
JAudioSampleButton qui hérite de JButton fera son doClick() comme les
autres. Or, qui dit cas particulier dit de toutes façons du code à
rajouter.
Il serait préférable que toutes les modifications nécessaires pour
prendre en compte un JAudioSampleButton soient contenues... dans
JAudioSampleButton, et pas ailleurs.
Là je suis d'accord mais comment tu fais dans ce cas précis ? Tu mets le
code du KeyListener personnalisé dans chaque composant ? Ca veut dire
qu'il faut étendre tous les composants déjà existants et créer
MyJButton, MyJComboBox, MyJTextField etc ? je vois vraiment pas
l'interêt car ça fait encore plus de boulot...(*) Un exemple de Decorator pour la hiérarchie JComponent:
http://www.onjava.com/pub/a/onjava/2003/02/05/decorator.html
Laurent
http://bossavit.com/thoughts/
Thibaut
Normalement, tu remplaces
le test sur la classe par un appel polymorphique.
Hein ?? Désolé masi tu peux préciser s'il te plait ? J'avoue que j'ai
jamais vraiment étudié le polymorphisme alors c'est un mot qui me fait
encore peur... (Si ca se trouve je m'en suis déjà servi sans le savoir :-p )
Normalement, tu remplaces
le test sur la classe par un appel polymorphique.
Hein ?? Désolé masi tu peux préciser s'il te plait ? J'avoue que j'ai
jamais vraiment étudié le polymorphisme alors c'est un mot qui me fait
encore peur... (Si ca se trouve je m'en suis déjà servi sans le savoir :-p )
Normalement, tu remplaces
le test sur la classe par un appel polymorphique.
Hein ?? Désolé masi tu peux préciser s'il te plait ? J'avoue que j'ai
jamais vraiment étudié le polymorphisme alors c'est un mot qui me fait
encore peur... (Si ca se trouve je m'en suis déjà servi sans le savoir :-p )
Là je suis d'accord mais comment tu fais dans ce cas précis ? Tu mets le
code du KeyListener personnalisé dans chaque composant ? Ca veut dire
qu'il faut étendre tous les composants déjà existants
Là je suis d'accord mais comment tu fais dans ce cas précis ? Tu mets le
code du KeyListener personnalisé dans chaque composant ? Ca veut dire
qu'il faut étendre tous les composants déjà existants
Là je suis d'accord mais comment tu fais dans ce cas précis ? Tu mets le
code du KeyListener personnalisé dans chaque composant ? Ca veut dire
qu'il faut étendre tous les composants déjà existants
Thibaut,Normalement, tu remplaces
le test sur la classe par un appel polymorphique.
Hein ?? Désolé masi tu peux préciser s'il te plait ? J'avoue que j'ai
jamais vraiment étudié le polymorphisme alors c'est un mot qui me fait
encore peur... (Si ca se trouve je m'en suis déjà servi sans le savoir :-p )
Dans les grandes lignes, ça consiste à remplacer ceci:
Animal unAnimal;
if (unAnimal instanceof Chien)
System.out.println("Ouah");
if (unAnimal instanceof Chat)
System.out.println("Miaou");
...par cela:
public interface Animal
public void crie()
public class Chien implements Animal
public void crie()
System.out.println("Ouah");
public class Chat implements Animal
public void crie()
System.out.println("Miaou");
Animal unAnimal;
unAnimal.crie();
Laurent
http://bossavit.com/thoughts/
Thibaut,
Normalement, tu remplaces
le test sur la classe par un appel polymorphique.
Hein ?? Désolé masi tu peux préciser s'il te plait ? J'avoue que j'ai
jamais vraiment étudié le polymorphisme alors c'est un mot qui me fait
encore peur... (Si ca se trouve je m'en suis déjà servi sans le savoir :-p )
Dans les grandes lignes, ça consiste à remplacer ceci:
Animal unAnimal;
if (unAnimal instanceof Chien)
System.out.println("Ouah");
if (unAnimal instanceof Chat)
System.out.println("Miaou");
...par cela:
public interface Animal
public void crie()
public class Chien implements Animal
public void crie()
System.out.println("Ouah");
public class Chat implements Animal
public void crie()
System.out.println("Miaou");
Animal unAnimal;
unAnimal.crie();
Laurent
http://bossavit.com/thoughts/
Thibaut,Normalement, tu remplaces
le test sur la classe par un appel polymorphique.
Hein ?? Désolé masi tu peux préciser s'il te plait ? J'avoue que j'ai
jamais vraiment étudié le polymorphisme alors c'est un mot qui me fait
encore peur... (Si ca se trouve je m'en suis déjà servi sans le savoir :-p )
Dans les grandes lignes, ça consiste à remplacer ceci:
Animal unAnimal;
if (unAnimal instanceof Chien)
System.out.println("Ouah");
if (unAnimal instanceof Chat)
System.out.println("Miaou");
...par cela:
public interface Animal
public void crie()
public class Chien implements Animal
public void crie()
System.out.println("Ouah");
public class Chat implements Animal
public void crie()
System.out.println("Miaou");
Animal unAnimal;
unAnimal.crie();
Laurent
http://bossavit.com/thoughts/
Non, ça c'est la spécialisation, pas le polymorphisme. :)
m.nourrir(medor); // appelle la première méthode
m.nourrir(minou); // appelle la deuxième méthode
Non, ça c'est la spécialisation, pas le polymorphisme. :)
m.nourrir(medor); // appelle la première méthode
m.nourrir(minou); // appelle la deuxième méthode
Non, ça c'est la spécialisation, pas le polymorphisme. :)
m.nourrir(medor); // appelle la première méthode
m.nourrir(minou); // appelle la deuxième méthode