[JAVA] Problème de conception

Problème de conception [JAVA] - Java - Programmation

Marsh Posté le 03-04-2003 à 12:44:27    

J'ai une classe Arbre qui contient des Noeud chainés entre eux
J'aimerais pouvoir dériver cette classe Arbre pour en faire un arbre plus spécialisé qui ne pourrait contenir que des instances d'une sous classe donnée de Noeud
Comment faire cela proprement, sans avoir à caster dans tous les sens ? Merci


Message édité par noldor le 03-04-2003 à 13:29:50
Reply

Marsh Posté le 03-04-2003 à 12:44:27   

Reply

Marsh Posté le 03-04-2003 à 13:28:51    

noldor a écrit :

J'aimerais pouvoir dériver cette classe Arbre pour en faire un arbre plus spécialisé qui ne pourrait contenir que des instances d'une sous classe donnée de Arbre

 
qui ne pourrai contenir que des instances d'une sous-classe de Noeud, plutot, non ?

Reply

Marsh Posté le 03-04-2003 à 13:30:28    

bobuse a écrit :

 
qui ne pourrai contenir que des instances d'une sous-classe de Noeud, plutot, non ?

Oui c'est ça, merci
J'ai édité

Reply

Marsh Posté le 03-04-2003 à 13:35:51    

pour resume tu veux :
 
 


Arbre                 Noeud
  |                     |
  +--ArbreMieux         +--NoeudMieux


et une solution propre ...
et ben tu surcharges les méthodes d'ajout/acces aux noeuds de l'arbre, pour ne prendre en parametre que le type d'Objet que tu souhaite manipuler. Non ?
 
EDIT : non, en fait ca marche pas :D


Message édité par bobuse le 03-04-2003 à 13:36:25
Reply

Marsh Posté le 04-04-2003 à 09:21:00    

une petite idée ? y a un pattern qui permettrait ce genre de choses ?

Reply

Marsh Posté le 04-04-2003 à 14:11:43    

Pour un contrôle à la compilation, oui : ça s'appelle la généricité. Mais elle ne sera intégrée à Java qu'avec le JDK 1.5.
 
Sinon, tu peux toujours insérer des "assert(monNoeud instanceof NoeudMieux);" dans les méthodes de ArbreMieux qui attendent des arguments de type Noeud.

Reply

Marsh Posté le 04-04-2003 à 14:16:35    

Ben, à mon avis, dans ce cas là, 'faut que t'utilise la délégation, pas l'héritage.
Je m'explique.
Dans ta classe Arbre, t'as forcément une méthode AddNoeud(Noeud leNoeud) qui prend une instance Noeud en paramètre. Si ta classe ArbreSpecial hérite d'arbre, elle comportera forcément cette meme  méthode prenant elle aussi un Noeud en paramètre (surchargée ou non). La solution donc, c'est de ne pas héruter d'Arbre, mais d'utiliser une instance d'Arbre, attribut privé (ou protégé) de ArbreSpecial.

Reply

Marsh Posté le 04-04-2003 à 14:22:21    

El_gringo a écrit :

Ben, à mon avis, dans ce cas là, 'faut que t'utilise la délégation, pas l'héritage.
Je m'explique.
Dans ta classe Arbre, t'as forcément une méthode AddNoeud(Noeud leNoeud) qui prend une instance Noeud en paramètre. Si ta classe ArbreSpecial hérite d'arbre, elle comportera forcément cette meme  méthode prenant elle aussi un Noeud en paramètre (surchargée ou non). La solution donc, c'est de ne pas héruter d'Arbre, mais d'utiliser une instance d'Arbre, attribut privé (ou protégé) de ArbreSpecial.


vouii, je savais bien qu'il y avait une sol. (je l'avais deja utilise une fois).
kidimieux

Reply

Marsh Posté le 04-04-2003 à 14:31:14    

El_gringo a écrit :

Ben, à mon avis, dans ce cas là, 'faut que t'utilise la délégation, pas l'héritage.
Je m'explique.
Dans ta classe Arbre, t'as forcément une méthode AddNoeud(Noeud leNoeud) qui prend une instance Noeud en paramètre. Si ta classe ArbreSpecial hérite d'arbre, elle comportera forcément cette meme  méthode prenant elle aussi un Noeud en paramètre (surchargée ou non). La solution donc, c'est de ne pas héruter d'Arbre, mais d'utiliser une instance d'Arbre, attribut privé (ou protégé) de ArbreSpecial.

ah ben oui, c'est le mieux en effet !
Merci bcp :jap:

Reply

Marsh Posté le 04-04-2003 à 14:41:52    

L'héritage c'est fait puor étendre le champ d'action, pas pour le restreindre (d'ou le mot clé "extends" d'ailleurs j'pense !)

Reply

Marsh Posté le 04-04-2003 à 14:41:52   

Reply

Marsh Posté le 04-04-2003 à 14:43:33    

El_gringo a écrit :

L'héritage c'est fait puor étendre le champ d'action, pas pour le restreindre (d'ou le mot clé "extends" d'ailleurs j'pense !)


Oui, mais des classes héritées peuvent aussi être des spécialisations de la classe mère

Reply

Marsh Posté le 04-04-2003 à 14:45:07    

noldor a écrit :


Oui, mais des classes héritées peuvent aussi être des spécialisations de la classe mère


 
Ouais, c'est vrai. Pas besoin de chercher bien loin d'ailleurs : la classe Object par exemple !

Reply

Marsh Posté le 04-04-2003 à 14:45:54    

Mais justement, la classe Object défini le minimum qu'est capable de faire toute classe. Tu vois ce que je veux dire ?

Reply

Marsh Posté le 04-04-2003 à 14:52:02    

El_gringo a écrit :

Ben, à mon avis, dans ce cas là, 'faut que t'utilise la délégation, pas l'héritage.
Je m'explique.
Dans ta classe Arbre, t'as forcément une méthode AddNoeud(Noeud leNoeud) qui prend une instance Noeud en paramètre. Si ta classe ArbreSpecial hérite d'arbre, elle comportera forcément cette meme  méthode prenant elle aussi un Noeud en paramètre (surchargée ou non). La solution donc, c'est de ne pas héruter d'Arbre, mais d'utiliser une instance d'Arbre, attribut privé (ou protégé) de ArbreSpecial.


 
Je la sent très mal ton affaire, ne serais-ce que parce que la plupart de mes arbre ne contienent pas de méthode pour ajouter un noeud.
on peut avoir un bout de code ?

Reply

Marsh Posté le 04-04-2003 à 15:15:29    

nraynaud a écrit :


 
Je la sent très mal ton affaire, ne serais-ce que parce que la plupart de mes arbre ne contienent pas de méthode pour ajouter un noeud.
on peut avoir un bout de code ?


 
Nan, mais j'donnais ça comme exemple. Ton arbre, il contient bien des noeuds, non !? (à moins que t'implémentes des arbres vides, mais là c'est autre chose ! :D). Donc à un moment ou un autre, t'as bien une ou des méthodes qui prennent des instances de Noeud en paramètre, non ?
Et puis, le code c'est pas moi qui l'ai écrit, j'répond à la question de noldor, c'est tout !

Reply

Marsh Posté le 04-04-2003 à 15:30:04    

El_gringo a écrit :

Mais justement, la classe Object défini le minimum qu'est capable de faire toute classe. Tu vois ce que je veux dire ?


 
Point vocabulaire : axe de spécialisation/axe de généralisation
 
Essaye de reformuler maintenant.


Message édité par nraynaud le 04-04-2003 à 15:31:37
Reply

Marsh Posté le 04-04-2003 à 15:45:39    

nraynaud a écrit :


 
Point vocabulaire : axe de spécialisation/axe de généralisation
 
Essaye de reformuler maintenant.


 
1 - ça avance à quoi au juste ton point vocabulaire ?
2 - tu pinailles alors que le sujet est clos, tout le monde à compris. (sauf toi !? :D)

Reply

Marsh Posté le 04-04-2003 à 17:29:50    

C'est toujours intéressant d'utiliser le vocabulaire le plus précis possible, mon cher...

Reply

Marsh Posté le 04-04-2003 à 19:58:48    

El_gringo a écrit :


2 - tu pinailles alors que le sujet est clos, tout le monde à compris. (sauf toi !? :D)


 
Ça m'étonnerai que le sujet soit clos dans ta tête vu comment tu définis l'affaire ; ou alors il va falloir faire une demande de réouverture de dossier.

Reply

Marsh Posté le 05-04-2003 à 02:21:19    

débat "is a" vs "use a".
 
je vote pour le "use a" !


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 06-04-2003 à 18:20:06    

benou a écrit :

débat "is a" vs "use a".
 
je vote pour le "use a" !


 :heink: heu le "is a" ca correspond a l'heritage, et le "use a" a une association du genre aggrégation/composition ... donc il y a pas de versus  
 :??:


---------------
get amaroK plugin
Reply

Marsh Posté le 06-04-2003 à 18:44:38    

ben si : assez souvent, pour réutiliser les possibilités d'un objet, tu as le choix entre l'étendre ou l'agréger ...
 
exemple de débat : la classe java.util.Stack qui étend Vector, ce qui est une abération pour une pile ... ca a fait couler pas mal d'encre


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 06-04-2003 à 23:23:02    

benou a écrit :

débat "is a" vs "use a".
 
je vote pour le "use a" !


C'est pas compliqué si la question ce pose c'est délégation ; le mec qui est pas jouasse fera un adaptateur.
Par contre, quand ta hiérarchie est polluée tu te touches pour corriger.

Reply

Marsh Posté le 07-04-2003 à 08:48:59    

Ouais, c'est bien ce que j'dis : le sujet est clos, depuis une quinzaine de posts d'ailleurs. Donc, à part que Raynaud m'emmerde avec je sais trop quels détails à la con, le sujet est clos.

Reply

Marsh Posté le 07-04-2003 à 09:59:37    

benou a écrit :

ben si : assez souvent, pour réutiliser les possibilités d'un objet, tu as le choix entre l'étendre ou l'agréger ...
 
exemple de débat : la classe java.util.Stack qui étend Vector, ce qui est une abération pour une pile ... ca a fait couler pas mal d'encre


Ha ok, j'avais pas pigé ! ;)
 
Ben dans ce cas, je pense que quand on peut et que c'est justifié par une spécialisation, le "is a" est plus pratique

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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