|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||
|
Membre du Club
![]() Inscription : octobre 2006 Messages : 102 ![]() |
Bonjour à tous,
Je pense avoir compris comment créer une sous-classe qui hérite (avec "extends") des méthode de sa classe-mère, mais je ne comprends pas comment enrichir une classe existante, sans modifier celle-ci, et sans créer de sous-classe. Exemple, j'aimerais disposer d'une méthode qui me dit si une chaîne est un anagramme, je voudrais donc compléter la classe String par: Code :
Code :
Comment faire ? Merci d'avance, G. |
||||
|
|
00
|
|
|
#2 |
|
Nouveau Membre du Club
![]() Inscription : janvier 2008 Messages : 75 ![]() |
Ca doit pas être possible de modifier un .class (ici String.class), et vu que tu n'a pas accès au String.java originel, c'est raté.
Donc, à priori, héritage comme solution... |
|
|
00
|
|
|
#3 | ||
![]() ![]() Nicolas Ingénieur développement logiciels Inscription : juin 2009 Messages : 1 715 ![]() |
L'héritage est justement fais pour ça car là tu ne veux plus utiliser la classe String de base mais une classe custom. Tu peux faire une classe à côté sinon qui prend en paramètre un String tout simplement si la solution de la sous-classe ne te plait pas :
Code :
__________________
|
||
|
|
00
|
|
|
#4 |
![]() ![]() |
on ne peux pas faire de sous classe de String, String est final.
__________________
⥀⥁ Чиз faq java, cours java, javadoc. Pensez à et ![]() "Votre génitrice tute des pédoncules au pandémonium" (le conjurateur, 1973) |
|
|
50
|
|
|
#5 |
![]() ![]() Nicolas Ingénieur développement logiciels Inscription : juin 2009 Messages : 1 715 ![]() |
Donc il ne te reste que la solution de la classe utilitaire.
__________________
|
|
|
20
|
|
|
#6 |
|
Membre émérite
![]() Inscription : mai 2006 Messages : 787 ![]() |
Tout d'abord, il faut voir une classe ou une interface comme un contrat. C'est à dire que toute classe qui herite d'une autre classe ou qui implemente une interface devra definir les methodes de celles-ci.
Par exemple, si je prends une instance de object ou d'un de ses descendants, je suis sur d'avoir une méthode toString(). Pour ajouter une methode à une classe existante, il faut faire une sous classe. Par exemple, si Fils herite de Pere, Fils possedera toutes les fonctions de Pere plus celles qu'elle définira elle meme. Ainsi, Fils pourra etre utilisé partout ou Pere etait utilisé. En revanche, Pere ne pourra pas etre utilisé la ou Fils est utilisé. Pour répondre à la question de base, il est possible d'ajouter une methode à une classe existante. Pour ca, tu peux regarder du coté de la programmation orientée Aspect. Mais dans ton cas, il faut passer comme ca a été indiqué par une classe utilitaire. |
|
|
00
|
|
|
#7 | |
|
Expert Confirmé Sénior
![]() Inscription : septembre 2004 Messages : 5 099 ![]() |
Pour résumer :
Citation:
Et il est rare que ce soit gênant. Des solutions très raisonnables ont été proposées ici. |
|
|
|
00
|
|
|
#8 | ||
![]() ![]() Inscription : août 2006 Messages : 2 848 ![]() |
Tu peux aussi utiliser le pattern decorator, il me semble (à vérifier) :
Code :
Tu redéfinis toutes les méthodes de la classe String, mais qui font simplement appel à l'implémentation de ton objet String, comme pour length dans l'exemple. Puis tu rajoutes les méthodes propres à ton implémentation. C'est fastidieux puisque String a beaucoup de méthodes mais ça peut être parfois intéressant. |
||
|
|
00
|
|
|
#9 | ||
|
Membre confirmé
![]() ![]() Inscription : juin 2005 Messages : 171 ![]() |
Bonjour,
Juste pour compléter le message de fr1man, le pattern Decorator nécessite que la classe décoratrice hérite d'une base commune à la class décorée. Et ce afin que la classe décoratrice puisse être utilisé partout une un object décoré est attendu. Donc ça donnerait : Code :
Quoiqu'il en soit le pattern Décorator est une solution élégante dans le cas évoqué dans ce topic. |
||
|
|
00
|
|
|
#10 | ||
|
Membre régulier
![]() ![]() Mikaël GibertIngénieur développement logiciels Inscription : septembre 2011 Messages : 31 ![]() |
Je me permet d'ouvrir une petite parenthèse : il est tout à fait possible d'ajouter des méthodes à une classe sans héritage en utilisant des APIs "sauvages" permettant de manipuler le bytecode.
Avec Javassist : Code :
|
||
|
00
|
|
|
#11 |
![]() ![]() |
Pour rappel, on parle là d'un problème de débutant par rapport au language, donc les modifications sauvage d'une classe de java.lang on oublie, et l'orienté aspect aussi. C'est sortir les cuirassé pour souffler une mouche morte!
Donc, non, en java, on n'ajoute pas une méthode à une classe existante, on utilise l'héritage pour ça. Et non, ce n'est donc pas applicable à String puisque cette classe est final.
__________________
⥀⥁ Чиз faq java, cours java, javadoc. Pensez à et ![]() "Votre génitrice tute des pédoncules au pandémonium" (le conjurateur, 1973) |
|
|
40
|
|
|
#12 |
|
Membre Expert
![]() Ingénieur développement logiciels Inscription : septembre 2008 Messages : 733 ![]() |
Il est clair que le problème ici est un problème de compréhension par l'auteur. Et de tels bidouillages sont franchement à bannir.
|
|
|
00
|
|
|
#13 | |
|
Membre émérite
![]() Inscription : mai 2006 Messages : 787 ![]() |
Citation:
Oui mais ca n'empeche pas de parler de techniques qui permettraient de faire ca. Peut etre que certains qui vont tomber sur ce topic à travers un moteur de recherche seront contents de trouver une réponse. Mais sur le fond, je suis d'accord pour dire que ce ne sont pas les techniques à utiliser pour le probleme dont on parle (mais les solutions ont deja été données des le début...) |
|
|
|
00
|
|
|
#14 |
|
Membre confirmé
![]() ![]() Inscription : juin 2005 Messages : 171 ![]() |
Ben oui c'est vrai ça ! au temps pour moi
Donc pas d'héritage de String. Donc soit une classe Utilitaire avec une méthode prenant une String en parametre et retournant un booleen. La méthode triviale Une classe wrapper, un peu sur le model du Décorator mais sans l'héritage... ou au pire un Décorator avec héritage de l'interface CharSequence pour garder un peu de souplesse (mais est-ce vraiment utile vu le besoin initial ...) |
|
|
00
|
|
|
#15 |
![]() ![]() |
j'avoue qu'en bientot 8 ans d'usage professionnel de java, je n'ai jamais eu besoin d'ajouter une méthode dans String
__________________
⥀⥁ Чиз faq java, cours java, javadoc. Pensez à et ![]() "Votre génitrice tute des pédoncules au pandémonium" (le conjurateur, 1973) |
|
|
00
|
|
|
#16 |
|
Membre Expert
![]() Ingénieur développement logiciels Inscription : septembre 2008 Messages : 733 ![]() |
|
|
|
00
|
|
|
#17 |
|
Membre éprouvé
![]() Eric Inscription : décembre 2010 Messages : 254 ![]() |
Pour ce qui est de modifier la classe String par des moyens détournés, il me semble que de toutes façons les JVM standard sont, pour des raison de sécurité, protégées contre les redéfinition du contenu de java.lang, donc sauf à modifier le JRE (du genre patcher la bilbiothèque de base qui contient java.lang), on ne peut pas "bidouiller" String.
|
|
|
00
|
|
|
#18 |
![]() ![]() |
avec aop et compagnie, tu ne sait rien faire, que ce soit dans java.lang ou autre chose, si t'es dans un environnement avec un securitymanager (applet, webstart, certains serveurs J2EE)
__________________
⥀⥁ Чиз faq java, cours java, javadoc. Pensez à et ![]() "Votre génitrice tute des pédoncules au pandémonium" (le conjurateur, 1973) |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com