Partage
  • Partager sur Facebook
  • Partager sur Twitter

une si petite différence, mais un si gros problème

    25 novembre 2018 à 16:09:36

    Bonjour,

    Mon programme commence par une création de personnage, et lors de cette création, l'utilisateur choisis son sexe (homme ou femme).

    Les classe concernées sont: Humain dont hérite Client dont hérite ClientHomme et ClientFemme. une seule caractéristique diférencie ces classes (C'est imposé par le sujet...) c'est que ClientHomme a une couleur de T-shirt et ClientFemme a un bijou porté. La difficulté et que j'aimerai utiliser une seule et même variable, à savoir une liste de clients (peu importe le sexe) que je puisse exploiter pour le reste du programme, sinon ça m'obligerai à faire un programme miroir (pour l'un et l'autre sexe). Mais je ne sais pas comment faire...

    • Partager sur Facebook
    • Partager sur Twitter
      25 novembre 2018 à 16:27:46

      Salut !

      Il semble un chouilla sexiste le sujet qu'on t'a donné, surtout pour le faire ce week-end ;-)

      Mais qu'est-ce qui te bloque exactement ?

      Tu peux faire une "List<Client>" dans laquelle tu pourras aussi bien ajouter des instances de "ClientHomme" que des "ClientFemme".
      • Partager sur Facebook
      • Partager sur Twitter
        25 novembre 2018 à 16:52:35

        oui j'y ai pensé, mais après je n'aurai plus accès aux getters et au setters car quand je ferais la list.get() il ne saura pas vers quel Objet (homme ou femme) je pointe.
        • Partager sur Facebook
        • Partager sur Twitter
          25 novembre 2018 à 22:48:50

          Salut !

          Si tu fait ce qu'a dit macaque, il te suffira juste de faire ((ClientHomme)client).méthode() ou ((ClientFemme)client).méthode() selon le type

          Pour savoir de quel genre, il suffit de faire une variable genre dans le type Client, et dans le constructeur de ClientFemme et ClientHomme mettre genre = "homme" ou genre = "femme" 

          J'espère que t'arriveras à me comprendre :)

          • Partager sur Facebook
          • Partager sur Twitter
            3 décembre 2018 à 20:51:23

            Et si tu as la joie de coder en java 8, tu pourras récupérer tes liste comme suit (pour faire des stats par exemple):

            List<Client> humans = ...;
            
            List<ClientHomme> mens = humans.stream().filter(h -> h instanceof ClientHomme).collect(Collectors.toList());
            List<ClientFemme> womens = humans.stream().filter(h -> h instanceof ClientFemme).collect(Collectors.toList());



            -
            Edité par Emilien G. 3 décembre 2018 à 20:51:39

            • Partager sur Facebook
            • Partager sur Twitter
            Merci, Cordialement.
              3 décembre 2018 à 23:25:27

              Salut,

              Je ne sais pas qui a bien pu te donner ce genre d'exercice, mais c'est un super nul en conception!

              Lorsque l'on décide de faire hériter plusieurs classe d'une même classe de base, ce n'est pas pour permettre de faire varier des caractéristiques, mais bien pour permettre de faire varier des comportements (même si le fait d'adapter un comportement peut -- effectivement -- occasionner une variation au niveau des attributs :P)

              Alors, on peut -- effectivement -- faire en sorte de retomber sur ses pattes en ajoutant un comportement "changer de T shirt" pour l'homme et un comportement "changer de bijoux" pour la femme (et, surtout pas de setXXX pour l'un ou pour l'autre, car les mutateur sont une véritable calamité!!!), mais le problème restera le même:

              • Il n'y a absolument aucun sens à exposer ces comportement depuis la classe de base, vu qu'un homme ne peut forcément pas changer de bijoux, et qu'une femme ne peux absolument pas changer de T shirt (cela n'aurait absolument aucun sens)
              • pour pouvoir profiter de ces deux service totalement distincts, il faut disposer du type réel du client, ce qui n'est possible qu'à coup de double dispatch si l'on souhaite maintenir une liste qui puisse contenir aussi bien des hommes que des femmes

              Par contre, en fonction des interfaces que ta classe client implémente, tu peux -- effectivement -- envisager d'adapter (au niveau des classes ClientHomme et ClientFemme) le comportement des fonctions exposées par ces interfaces, de manière à prendre spécifiquement en compte le fait que tu as affaire à un homme ou à une femme ;)

              -
              Edité par koala01 3 décembre 2018 à 23:30:48

              • Partager sur Facebook
              • Partager sur Twitter
              Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs  à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait

              une si petite différence, mais un si gros problème

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown