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

Java Discussion :

Generics, héritage, et return this


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 15
    Par défaut Generics, héritage, et return this
    Hello !

    J'ai un petit soucis et j'aurai besoin de votre expertise. J'ai deux classes avec leurs méthodes :
    • VendeurAbstrait<TypeArticle> : ditBonjourAuClient(), commandeArticle(TypeArticle)
    • VendeurVoleur<TypeArticle> : entubeLeClient()


    Un VendeurVoleur est un VendeurAbstrait.
    Le truc, c'est que j'aimerais bien chainer l'appel des méthodes comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    new VendeurVoleur<Carotte>().ditBonjourAuClient().entubeLeClient();
    Le problème est que si je mets un "return this" dans ditBonjourAuClient(), il me renvoie un VendeurAbstrait et donc entubeLeClient() n'est pas reconnu. J'ai essayé plusieurs approches pour pallier à ce problème mais n'en ai trouvé aucune de propre.

    Est-ce que vous avez une idée ?
    Merci d'avance !

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Dans ces conditions, tu ne peux pas chaîner de manière fiable.

    Note toutefois, que ça ne sert pas à grand-chose d'avoir une méthode publique entubeLeClient() dans VendeurVoleur et dans aucune autre classe.
    À quoi ça sert d'avoir un niveau d'abstraction si de toute façon on doit être certain d'avoir un VendeurVoleur et rien d'autre ?

    Ce qu'il te faut, c'est une méthode abstraite traiteLeClient() dans VendeurAbstrait.

    Dans VendeurVoleur, la méthode entubeLeClient() est privée, et tu implémentes traiteLeClient() en appelant juste entubeLeClient() et c'est tout.
    Simple usage du polymorphisme.

    Du coup, tu peux faire un appel chaîné :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    new VendeurVoleur<Carotte>().ditBonjourAuClient().traiteLeClient();
    et ça marche, vu que c'est un VendeurVoleur, il traite le client en l'entubant.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre émérite
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Par défaut
    Bonjour.

    Techniquement, il existe une solution, celle de redéfinir la méthode ditBonjourAuClient dans VendeurVoleur pour qu'elle renvoie 'son' this:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    VendeurVoleur ditBonjourAuClient() {
        super.ditBonjourAuClient();
        return this;
    }
    Conceptuellement, si le but est juste de pouvoir chainer (=la méthode renvoie toujours this), je ne le conseille pas: autant faire deux appels successifs...

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 15
    Par défaut
    thelvin > J'ai trop simplifié l'exemple. Dans mon cas, la classe VendeurAbstrait a une vingtaine de méthodes, a plusieurs classes qui l'étendent, et ces classes qui l'étendent peuvent avoir un nombre indéterminé de méthodes "spécifiques". Je ne peux donc pas créer une méthode "générique" traiteLeClient.

    Deaf > J'y ai pensé, mais vu le nombre de classes et de méthodes, j'ai abandonné l'idée.

    Finalement, je dois me rendre à l'évidence, ce n'est pas possible. Tant pis pour le chaînage.

    Merci pour vos réponses !

  5. #5
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par LeGritche Voir le message
    thelvin > J'ai trop simplifié l'exemple. Dans mon cas, la classe VendeurAbstrait a une vingtaine de méthodes, a plusieurs classes qui l'étendent, et ces classes qui l'étendent peuvent avoir un nombre indéterminé de méthodes "spécifiques". Je ne peux donc pas créer une méthode "générique" traiteLeClient.
    Si une seule ne suffit pas, fais-en autant que tu as besoin.
    C'est ça, le principe de l'abstraction. À quoi ça te sert d'avoir des méthodes spécifiques à une sous-classe ? Quel est le gain, par rapport à avoir juste des classes différentes sans lien entre elles ?
    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. return (this) return (*this) !
    Par DLOYAS dans le forum C++
    Réponses: 2
    Dernier message: 02/01/2015, 10h45
  2. public function __toString() { return $this->toto; }
    Par aitiahcene dans le forum Doctrine2
    Réponses: 5
    Dernier message: 21/05/2012, 18h55
  3. Retourner l'objet en cours (return this)
    Par Gugelhupf dans le forum C++
    Réponses: 3
    Dernier message: 29/02/2012, 20h34
  4. Generics, héritages et interfaces
    Par Mako 5013 dans le forum Général Java
    Réponses: 2
    Dernier message: 15/12/2011, 12h02
  5. [Java5] Generics et Héritage
    Par denisC dans le forum Langage
    Réponses: 1
    Dernier message: 09/05/2006, 14h54

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