IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

avec Java Discussion :

Imposer du code dans une méthode redéfinie


Sujet :

avec Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 227
    Points : 77
    Points
    77
    Par défaut Imposer du code dans une méthode redéfinie
    Bonjour. J'ai une méthode abstraite evalueResultat() dans une classe abstraite AbstractModele.
    Lorsqu'on redéfinit la méthode abstraite evalueResultat() dans une classe dérivée de AbstractModele, j'aimerais imposer que cette méthode contienne forcément le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    notifyResultatChanged()
    à la fin.
    Je peux modifier le contenu de la classe AbstractModele car c'est moi l'auteur.
    Le but, c'est que quelqu'un qui ne connaît pas le code et qui redéfinit ma méthode soit obligé de mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    notifyResultatChanged()
    à la fin.
    Est-ce que c'est possible?
    Merci.

  2. #2
    Membre régulier

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2011
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Septembre 2011
    Messages : 37
    Points : 89
    Points
    89
    Par défaut
    Tu peux faire ça en deux méthodes dans ta classe abstraite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public final void evalue() {
       evalueResultat();
       notifyResultatChanged();
    }
     
    protected abstract evalueResultat();
    Ca implique que celui qui appelle la méthode ne doit jamais appeler la méthode evalueResultat (il devra passer par la méthode evalue). En revanche ceux qui hériteront de ta classe abstraite n'auront qu'à implémenter la méthode evalue et le code que tu veux "forcer" sera systématiquement exécuté.

    Ca doit être le DP "template method" je crois...

  3. #3
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2008
    Messages
    1 190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 190
    Points : 2 657
    Points
    2 657
    Par défaut
    Citation Envoyé par mikael.gibert Voir le message
    Tu peux faire ça en deux méthodes dans ta classe abstraite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public final void evalue() {
       evalueResultat();
       notifyResultatChanged();
    }
     
    protected abstract evalueResultat();
    Ca implique que celui qui appelle la méthode ne doit jamais appeler la méthode evalueResultat (il devra passer par la méthode evalue). En revanche ceux qui hériteront de ta classe abstraite n'auront qu'à implémenter la méthode evalue et le code que tu veux "forcer" sera systématiquement exécuté.

    Ca doit être le DP "template method" je crois...
    Et bien cela dépend si en l'implémentant l'utilisateur fait un super.evalue() ou pas.

  4. #4
    Membre éclairé Avatar de JoeChip
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    536
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 536
    Points : 803
    Points
    803
    Par défaut
    En revanche ceux qui hériteront de ta classe abstraite n'auront qu'à implémenter la méthode evalueResultats et le code que tu veux "forcer" sera systématiquement exécuté.
    Sans danger si utilisé conformément au mode d'emploi.

    (anciennement BenWillard, enfin moins anciennement que ... enfin bon c'est une longue histoire... Un genre de voyage dans le temps...)

  5. #5
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Points : 5 943
    Points
    5 943
    Par défaut
    Citation Envoyé par deathness Voir le message
    Et bien cela dépend si en l'implémentant l'utilisateur fait un super.evalue() ou pas.
    Comme l'a dit mikael.gibert, et pointé BenWillard, c'est la méthode evalueResultats() qui sera implémentée et pas la méthode evalue() qui est marquée final pour justement interdire sa réécriture .
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  6. #6
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2008
    Messages
    1 190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 190
    Points : 2 657
    Points
    2 657
    Par défaut
    Citation Envoyé par le y@m's Voir le message
    Comme l'a dit mikael.gibert, et pointé BenWillard, c'est la méthode evalueResultats() qui sera implémentée et pas la méthode evalue() qui est marquée final pour justement interdire sa réécriture .
    Oui j'avais lu trop vite et loupé le final!

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 227
    Points : 77
    Points
    77
    Par défaut
    Donc il faut avertir le programmeur qui dérive la classe AbstractModele qu'il doit, pour l'évaluation, utiliser la méthode evalue() et pas la méthode evalueResultat()?
    Donc le problème est le même que de le prévenir qu'il doit ajouter notifyResultatChanged() à la fin de la méthode evalueResultat() ?
    Je ne vois donc pas le gain qu'on a à utiliser la méthode final evalue puisque de toute façon il faut prévenir le programmeur.
    J'ai rien compris ou ce que je dis est juste?

  8. #8
    Membre régulier

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2011
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Septembre 2011
    Messages : 37
    Points : 89
    Points
    89
    Par défaut
    Oups, petite faute d'inattention, merci d'avoir corrigé!

    Donc, tout dépend : qui appelle la méthode evalue ? Elle est publique pour pouvoir être accédée depuis n'importe où, tandis que la méthode à surcharger (abstraite donc) est protected, ce qui signifie qu'elle n'est visible que par héritage et par les classes du même package.

    Si les appelants de ta méthode sont les classes héritées, aux développeurs de lire la documentation, ce qui revient au même...

    En revanche le cas que j'imaginais c'était que les appelants étaient externes (cad non hérités ni même package). Dans ce cas ils ont quelque chose du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    AbstractModele model = une instance concrète
    model.evalue();
    Tout dépend de ton cas en d'autres termes Je pensais que les personnes développant les appelants n'étaient pas les même que celles développant les dérivées.

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 227
    Points : 77
    Points
    77
    Par défaut
    Merci pour vos réponses.
    En fait, la classe abstraite doit être héritée dans le même package (le but est de faire un code facile à faire évoluer par un autre programmeur).
    Sinon, pour éviter les erreurs, je peux peut-être donner des noms plus explicites:
    Je garde le nom evalue() et je remplace le nom evalueResultat() par methodeEvaluation(), comme ça le programmeur ne peut pas se tromper lorsqu'il veut évaluer le résultat.

  10. #10
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2008
    Messages
    1 190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 190
    Points : 2 657
    Points
    2 657
    Par défaut
    Le nom comme la description des méthodes et de la classe sont tout aussi important

    Tu peux d'ailler donner dans la description de la classe des exemple d'utilisation de celle-ci!

  11. #11
    Membre régulier

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2011
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Septembre 2011
    Messages : 37
    Points : 89
    Points
    89
    Par défaut
    Pour pousser le vice, tu peux passer par une interface : Ton interface contient uniquement la signature de la méthode qui doit être appelée, ta classe abstraite implémente cette méthode (marquée final pour ne pas être héritée) en déléguant l'évaluation à la méthode abstraite evalueResultat puis appelle la méthode notifiyResultatChanged.

    Un petit exemple est plus parlant qu'un long discours :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    public interface Model {
        void evalue();
    }
     
    public abstract class AbstractModel implements Model {
        @Override
        public final void evalue() {
            evalueResultat();
            notifyResultatChanged();
        }
     
        protected abstract void evalueResultat();
     
        private void notifyResultatChanged() {
           //... 
        }
    }
    Ainsi les appelants de ta classe n'auront qu'à passer par l'interface qui définit le contrat et cela devrait éviter les confusions.

  12. #12
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Points : 5 943
    Points
    5 943
    Par défaut
    Citation Envoyé par mikael.gibert Voir le message
    Pour pousser le vice, tu peux passer par une interface.
    Je dirais même que ce n'est pas pousser le vice mais juste la bonne façon de faire ^^.
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 227
    Points : 77
    Points
    77
    Par défaut
    Je n'ai pas compris l'intérêt d'ajouter le pour un programmeur qui doit dériver la classe abstraite AbstractModel.
    C'est moi qui écris cette classe abstraite (qui n'aura plus à être modifiée), donc je sais que je dois implémenter la méthode evalue().
    Donc quelle est l'utilité du ?

  14. #14
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Disons que c'est plus flexible quand le type le plus haut est une interface.

    Plusieurs raisons :
    - Il est possible de définir, donc d'imposer, du code d'exécution dans une classe, même abstraite. Une interface, par contre, n'impose que l'implémentation des méthodes qu'elle déclare.
    Ainsi, si un jour AbstractModel fait des choses qui ne conviennent pas pour tout, il sera toujours possible de faire d'autres classes qui implémentent Model. Ça arrive souvent quand on fait des gros chantiers sur le code.

    - Il est possible d'étendre ou d'implémenter autant d'interfaces qu'on veut. Mais on ne peut étendre qu'une seule classe.
    Si jamais un Model avait un jour besoin d'être aussi d'autres choses (genre un RestApiAnswer ou je sais pas,) ce ne serait pas possible en lui imposant d'hériter d'une classe. Mais c'est sans problème en lui imposant d'implémenter une interface.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 16/04/2014, 13h54
  2. [Débutant] Passer des contrôles générés par code dans une autre méthode
    Par Abalalojik dans le forum C#
    Réponses: 1
    Dernier message: 19/02/2014, 14h33
  3. passer la valeur d'un return dans une méthode
    Par belukrin dans le forum Langage
    Réponses: 1
    Dernier message: 25/03/2006, 06h58
  4. instanciation problématique dans une méthode ActiveX
    Par mr.saucisse dans le forum MFC
    Réponses: 14
    Dernier message: 17/01/2006, 16h34
  5. Réponses: 2
    Dernier message: 15/11/2004, 15h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo