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

Langage Java Discussion :

Class avec un atribt non defini


Sujet :

Langage Java

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    somboomtunsajan
    Inscrit en
    Avril 2015
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : somboomtunsajan
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Avril 2015
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Class avec un atribt non defini
    Bonjour,

    Je viens vers vous car j'ai un problème qui m'est insoluble. J'ai une classe Login ainsi que deux classes Menage et Personnel. J'aimerais que en fonction de qui se connecte le Login soit instancié avec une variable de type Menage ou Personnel. Donc je voudrais avoir ce genre de choses :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Login auth = new Login("user", "pass");
    auth.getType() // qui renvois soit menage soit personnel qui me donne acces aux methode de menage ou de personnel selon qui se connecte
    Attention, quand on se connecte, je ne connais pas encore le type de personne : tout dépend du résultat de la requête SQL, donc si c'est "menage" faire new Menage() soit new personnel(), sinon.

    Merci, bien a vous

  2. #2
    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
    Hello,

    Au bout du compte ce dont tu parles est impossible. Java utilise un typage statique, donc si une variable est de type Login, elle possède les méthodes de la classe Login, rien de plus et rien de moins. Elle ne peut pas donner accès aux méthodes de Personnel ou de Menage.


    Une méthode simple est de faire un cast de ton objet vers le type correspondant, en faisant ce cast au moment où tu en as besoin : ajouter une méthode Object getAuthorizedObject() à ta classe Login :

    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
    public class Login {
     
      /* .... */
     
      public Object getAuthorizedObject() {
        switch(getType()) {
          case LoginType.PERSONNEL:
            return new Personnel(/* ... */);
          case LoginType.MENAGE:
            return new Menage(/* ... */);
        }
      }
     
      /* .... */
     
    }
    Puis s'en servir comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    switch(auth.getType()) {
      case LoginType.PERSONNEL:
        Personnel personnel = (Personnel)auth.getAuthorizedObject();
        return faireQuelqueChoseAvecUnPersonnel(personnel);
      case LoginType.MENAGE:
        Menage menage = (Menage)auth.getAuthorizedObject();
        return faireQuelqueChoseAvecUnMenage(menage);
    }

    Sinon, il y a les méthodes plus élaborées, dites "polymorphiques." Ça consiste à t'arranger pour que tes deux classes Personnel et Menage :
    - implémentent toutes les deux la même interface,
    - que tout ce qu'on demande à un Menage ou à un Personnel puisse toujours se faire à l'aide d'un appel à l'interface.

    Exemple, j'ai deux classes : Vache et Mouton. Vache a une méthode traire() et Mouton a une méthode tondre(). Mais je n'ai pas envie de devoir faire des switch pour déterminer si je suis devant une Vache ou un Mouton, ni de faire des casts pour appeler leurs méthodes.
    Donc à la place je fais :

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    interface Animal() {
      void recevoirSoinsDuJour(Outillage outillage);
    }
     
    public class Vache implements Animal {
     
      private void traire(Trayeuse trayeuse) {
        trayeuse.envoyerDuLait(153);
      }
     
      @Override
      public void recevoirSoinsDuJour(Outillage outillage) {
        traire(outillage.getTrayeuse());  
      }
     
    }
     
    public class Mouton implements Animal {
     
      private void tondre(ReservoirALaine laine) {
        laine.ajouterAuStock(23);
      }
     
      @Override
      public void recevoirSoinsDuJour(Outillage outillage) {
        tondre(outillage.getReservoirALaine());  
      }
     
    }
    qui s'utilise comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void traiterAnimaux(List<Animal> animaux) {
      for(Animal animal : animaux) {
        animal.recevoirSoinsDuJour(maFerme.getOutillage());
      }
    }
    Sans m'intéresser à savoir si les animaux sont des Vache ou des Mouton. C'est eux qui se chargent de le savoir.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. tableau de classe avec constructeur non copiable
    Par pixelou dans le forum Débuter
    Réponses: 3
    Dernier message: 22/02/2010, 23h09
  2. [CLASS] Class non definie, struct non definie
    Par Invité dans le forum C++
    Réponses: 2
    Dernier message: 26/02/2007, 21h16
  3. Réponses: 3
    Dernier message: 03/12/2006, 13h08
  4. Réponses: 3
    Dernier message: 05/09/2006, 00h47
  5. Une fonction avec des attributs non obligatoires
    Par YanK dans le forum Langage
    Réponses: 5
    Dernier message: 15/11/2002, 13h39

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