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

Collection et Stream Java Discussion :

Tableau et instanceof


Sujet :

Collection et Stream Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de koyot3
    Inscrit en
    Avril 2007
    Messages
    693
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 693
    Par défaut Tableau et instanceof
    Bonjour,

    j'ai un probleme de recuperation de type. je m'explique :
    je crée un tableau de type Employe. Or Employe peut etre un commercial ou un employé horaire.

    Employe[] employes = new Employe[5];

    employes[0]=new Employe("Poiret", new EmployeHoraire(42));
    employes[1]=new Employe("Burot", new EmployeHoraire(30));
    employes[2]=new Employe("Dupont", new Commercial(10000));
    employes[3]=new Employe("Ravier", new Commercial(20000));
    employes[4]=new Employe("Terrice", new Commercial(15000));
    or pour un calcul, je voudrais pouvoir a partir de employes[i] savoir comment faire pour connaitre si cet employé est un commercial ou non ....
    j'ai essayé avec les "instanceof" mais ca ne marche pas ...

    merci d'avance pour votre aide

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 802
    Par défaut
    Citation Envoyé par koyot3 Voir le message
    j'ai essayé avec les "instanceof" mais ca ne marche pas ...
    C'est pourtant bien la technique qu'il faut utiliser. Peux-tu nous montrer comment tu t'y prends ?

  3. #3
    Membre éclairé Avatar de koyot3
    Inscrit en
    Avril 2007
    Messages
    693
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 693
    Par défaut
    for(int i=0;i<employes.length;i++){

    if (employes[i] instanceof Commercial){
    salaireChef+=employes[i].calSalaire();
    }
    }
    "incompatible conditional operand types Employe and Commercial"
    voila ce que m'indique eclipse.....

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Février 2007
    Messages
    572
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 572
    Par défaut
    Ton problème, c'est que Commercial ne derive pas d'Employe

  5. #5
    Membre éclairé Avatar de koyot3
    Inscrit en
    Avril 2007
    Messages
    693
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 693
    Par défaut
    j'aurais du faire par héritage .....

    donc la, ya pas de solution possible ?

  6. #6
    in
    in est déconnecté
    Membre Expert Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Par défaut
    Ben si tu n'a pas de relation extends ou implements entre les deux types d'objet, comment veux tu que java devine que ces objets sont équivalents ??

  7. #7
    Membre confirmé Avatar de kerinel
    Profil pro
    Inscrit en
    Février 2007
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 103
    Par défaut
    D'après ce que tu as écrit, tu crées un employé en lui passant un paramètre supplémentaire de type EmployeCommercial ou EmployeHoraire.
    pour utiliser instanceof tu dois dériver la classe Employe en EmployeCommercial, EmployeHoraire etc...
    Quelque chose comme ceci:
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
     
    *********un premier fichier, Employe
    public class Employe{  //eventuellement abstract 
     
         String nom;
         //autre variable commune à tous les employés (adresse etc...)    
     
         public Employe(String nom){
              this.nom=nom;
              //autre truc à faire
         }
     
         public void uneMethodeCommuneaTousLesEmployes(){
             //faire un truc commun à tous les employés
         }
     
    }
     
    ***********Autre fichier EmployeHoraire
     
    public Class EmployeHoraire extends Employe{
     
             public int nombreDHeure;
             //autres variables particulières à un employé horaire
     
            public EmployeHoraire(String nom,int nbH){
                 super(nom);
                 nombreDHeure=bbH;
                 //autre choses particulières à un employé horaire
            }
     
            public void uneMethodePourlesEmployeHoraire(){
                  //faire un truc spécifique au employés horaires
           }
     
    }
     
    ************Autre fichier EmployeCommercial
     
    public Class EmployeCommercial extends Employe{
     
             public float pourcentage;
             //autres variables particulières à un employé commercial
     
            public EmployeCommercial(String nom,float perc){
                 super(nom);
                 pourcentage=perc;
                 //autre choses particulières à un employé commercial
            }
     
            public void uneMethodePourlesEmployeCommercial(){
                  //faire un truc spécifique aux commerciaux
           }
     
    }
     
    ***************Fichier pour utiliser
    //déclaration
    Employe[] employes = new Employe[5];
     
    employes[0]=new EmployeHoraire("Poiret", 42);
    employes[1]=new EmployeHoraire("Burot", 30);
    employes[2]=new EmployeCommercial("Dupont", 7.5);
    employes[3]=new EmployeCommercial("Ravier", 8.4);
    employes[4]=new EmployeHoraire("Terrice",20);
     
    ...
    //utilisation
    for (int i=0;i<employes.length;i++){
          if employes[i].instanceof(EmployeCommercial.class){
                       //faire le traitement ad-hoc
          }
    }
    Dans ton cas tu as peut être moyen de récupérer le second paramètre passé lors de la construction, mais tu perds l'avantage de l'héritage et ça me semble un peu "pas très clean" .

    Bon code,
    kerinel

    Edit: télescopage pendant que je postais... Pourquoi sans héritage ? Alors que c'est justement l'un des exemples types de l'héritage. En plus tu dois faire de l'héritage quelque part car ton constructeur de Employé accepte (String, Commercial) ou (String, Horaire). A moins d'avoir définis deux constructeurs. Mais dans ce cas si un jour tu veux créer des cadres, ou des employés "à la tache" il va falloir refaire encore d'autres constructeurs...

    Si vraiment tu veux faire sans héritage alors pourquoi faire une classe Commerciale et une classe Horaire. dans ce cas tu crées des objets inutiles et le fait que l'employé soit un commercial ou un horaire est géré uniquement par une variables de employé. éventuellement tu déclares des variables statiques
    public static final int EMPLOYE_HORAIRE et public static final EMPLOYE_COMMERCIAL .

    Bon code,
    kerinel

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 802
    Par défaut
    Si tu as ce message d'erreur, cela signifie que les classes EmployeHoraire et Commercial n'héritent pas de Employe. Lorsque tu ecris que les Employés peuvent être des employé horaire ou des commerciaux, de quelle façon implémentes-tu cela dans ton code ?

  9. #9
    Membre éclairé Avatar de koyot3
    Inscrit en
    Avril 2007
    Messages
    693
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 693
    Par défaut
    employes[4]=new Employe("Terrice", new Commercial(15000));
    j'ai un employé de type commercial dans cette case...
    je pense rajouter un parametre dans Employe pour reperer le type d'employé...

    je précise que le but est d'essayer de le faire sans héritage .....

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 802
    Par défaut
    Tu t'y prends bizarrement, m'enfin, c'est ton code

    Ce que tu peux faire est de rajouter un getter qui te permet de récupérer l'attribut correspondant au type de l'employé, puis tu vérifie le type de cet attribut. M'enfin, c'est vraiment tiré par les cheveux.

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

Discussions similaires

  1. trier un tableau et compter des elements du tableau
    Par remi51 dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 17/06/2002, 16h51
  2. Réponses: 2
    Dernier message: 27/05/2002, 19h46
  3. verification de doublons dans un tableau
    Par bohemianvirtual dans le forum C
    Réponses: 11
    Dernier message: 25/05/2002, 12h21
  4. transmision de tableau en parametre
    Par Horus dans le forum C++Builder
    Réponses: 3
    Dernier message: 16/05/2002, 11h15
  5. Réponses: 4
    Dernier message: 13/05/2002, 16h43

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