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 :

Lancer une methode d'un objet avec une variable


Sujet :

avec Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2006
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Mai 2006
    Messages : 174
    Par défaut Lancer une methode d'un objet avec une variable
    Bonjour,
    Merci pour votre aide à venir.

    Voici mon problème :
    J'ai des objets d'une class articles, j'ai une class tva avec 3 taux, une class main qui lance et gère les 2 autres.
    Voici mon programme Java :
    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
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
     
    package article;
    public class main {
        public static void main(String[] args) {
            // Création des objets articles vendus dans le supermarché
            // on utilise le mot clé new pour créer un nouvel objet.
            // nous faisons des intances de la class Article, nous créons des objets article.
            Article choufleur = new Article("Chou-fleur extra", 3.50, "tva3");
            Article roman = new Article("Les malheurs de Sophie", 16.50, "tva3");
            Article camembert = new Article("Cremeux 100%MG", 5.80, "tva3");
            Article cdrom = new Article("C++ en trois jours", 48.50, "tva1");
            Article boisson = new Article("Petit-lait", 2.50, "tva3");
            Article petitspois = new Article("Pois surgel'es", 4.35, "tva3");
            Article poisson = new Article("Sardines", 6.50, "tva3");
            Article biscuits = new Article("Cookies de grand-mere", 3.20, "tva3");
            Article poires = new Article("Poires Williams", 4.80, "tva3");
            Article cafe = new Article("100% Arabica", 6.90, "tva1");
            Article pain = new Article("Pain d'épautre", 6.90, "tva3");
     
            // Nous avons déclaré 11 articles
            // Nous pouvons afficher leur nom en appelant la méthode getNom() de cette façon
            System.out.println("Comme café nous avons : " + cafe.getNom()+ " à : " + cafe.getPrix()+" HT");
            System.out.println("Comme pain nous avons : " + pain.getNom()+ " à : " + pain.getPrix()+" HT");
            System.out.println();
     
            //On peux changer le prix du café par exemple en appelant la méthode setPrix()
            pain.setPrix(5.60);
            System.out.println("Notre pain : " + pain.getNom()+ " à changé de prix : " + pain.getPrix()+" HT");
     
            Tva tva1= new Tva("tva1",1.20);
            Tva tva2= new Tva("tva2",1.10);
            Tva tva3= new Tva("tva3",1.055);
     
        }
     
    }
     
    //Nous avons créé une class nommées article
    //Lorsque nous faisons des intances de cette class, nous créons des objets article.
    //Instanciation = création d’un objet à partir d’une classe
    //Objet = instance de classe
    class Article {
        // cette class possède 3 propriétés
        // nous protégeons nos variables d'instance en les déclarant private
        // Nous interdisons toute modification du nom avec la fonction "final"
        private final String nom;
        private double prix;
        private String codeTva;
     
        //nous avons un constructeur d'initialisation pour cette class
        //le constructeur d'une classe doit porter le même nom que la classe !
        // les constructeurs sont des méthodes servant à créer des objets ;
        public Article(String pnom, double pprix, String ptva) {
            this.nom = pnom;
            this.prix = pprix;
            this.codeTva = ptva;
        }
        // cette class dispose de 3 méthodes (les accesseurs)
        // ce sont des fonction servant à accéder aux données des objets 
        public double getPrix() {
            return prix;
        }
        public String getNom() {
            return nom;
        }
        public String getcodeTva() {
            return codeTva;
        }
     
        }
        // cette class dispose de 2 méthodes (les mutateurs)
        // ce sont des fonction servant à modifier les données des objets
        // Ici, on ne peut pas redéfinir le nom car il a été déclaré avec le mot "final"
        // On peut redéfinir la valeur du prix
        public void setPrix(double pprix) {
            prix = pprix;
        }
        //On peut redéfinir sa tva ou pas
        public void setcodeTva(String pcodeTva){
            codeTva = pcodeTva;
        }  
    }
     
    //Nous devons créé une class nommées Tva
    //Lorsque nous faisons des intances de cette class, nous créons des objets Tva.
    class Tva {
        // cette class possède 2 propriétés
        private String codeTva;
        private double tauxTva;
     
        // le constructeurs des objets Tva ;
        public Tva(String pcodetva, double ptauxtva) {
            this.codeTva = pcodetva;
            this.tauxTva = ptauxtva;
        }
        // cette class dispose de 2 méthodes servant à accéder aux données des objets 
        public double gettauxTva() {
            return tauxTva;
        }
        public String getcodeTva() {
            return codeTva;
        }
     
        // fonction servant à modifier les données des objets
        public void settauxTva(double ptauxTva) {
            tauxTva = ptauxTva;
        }
        //On peut redéfinir s'il est en action ou pas
        public void setAction(String pcodeTva){
            codeTva = pcodeTva;
        }  
    }
    Ce que je cherche à faire, c'est calculer le prix TTC de mes objets article

    Par exemple écrire un truc comme :
    System.out.println("Notre pain : " + pain.getNom()+ " à changé de prix : " + pain.getPrixttc()+" TTC");

    mais je ne sait pas écrire cette méthode "pain.getPrixttc()" dans la class article.

    ou encore quelque chose comme :
    System.out.println("Notre pain : " + pain.getNom()+ " à changé de prix : " + pain.getPrix() * pain.getcodeTva().gettauxTva()+" TTC");

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Citation Envoyé par papilou86 Voir le message
    Bonjour,
    mais je ne sait pas écrire cette méthode "pain.getPrixttc()" dans la class article.
    Pourtant tu as écrit la formule ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
           System.out.println("Notre pain : " + pain.getNom()+ " à changé de prix : " + pain.getPrix() * pain.getcodeTva().gettauxTva()+" TTC");
    Le problème que tu as, c'est que tu affectes dans la classe article un code de taux de tva par la méthode setcodeTva(String pcodeTva), pas une méthode qui affecte le taux de tva, qui lui est stocké dans une autre classe, Tva.

    Il te faut :

    1. soit affecter directement une instance de Tva au lieu d'une String (le code)
    2. soit avoir un moyen de chercher l'instance de Tva correspondant au code


    Je n'ai pas l'énoncé donc je ne sais pas comment tu es censé modéliser tout ça et quels sont les classes de Java que tu connais et que tu as le droit d'utiliser. Connais-tu les tableaux ? Connais-tu par exemple les List ? Connais-tu les Map ?

    Toujours est-il que si tu dois écrire une méthode getPrixTtc() dans la classe article, elle doit connaître les instances de Tva et pouvoir rechercher dans ces instances laquelle correspond... sans tableau, ni List, ni Map, il faut simplement tester chaque classe en comparant le code de tva de l'article à chacun des codes de ces instances :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Tva tvaaappliquer = null;
    if ( tva1.getcodeTva().equals( getcodeTva() ) {
       tvaaappliquer = tva1;
    }
    else if ( tva1.getcodeTva().equals( getcodeTva() ) {
       tvaaappliquer = tva2;
    }else if ( tva1.getcodeTva().equals( getcodeTva() ) {
       tvaaappliquer = tva3;
    }
    // ici tu n'as plus qu'à calculer le prix ttc en utilisant tvaappliquer pour récupérer le taux de tva (en appelant la méthode tvaappliquer.gettauxTva())
    Avec un tableau, on pourrait faire une boucle pour chercher tvaappliquer.

    on peut aussi faire la méthode getPrixTtc hors de la classe Article, sous forme de méthode static dans la classe main. Connais-tu les varargs ? Si oui, la signature pourrait s'écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public static double getPrixTTc(Article article, Tva...tva) {
        // ici on cherche l'instance de Tva dont le code correspond au code stocké dans article et on fait le calcul qu'on retourne en résultat
    }


    La question est sur le stockage du code de TVA dans l'article. Ce serait plus logique d'affecter une référence sur une instance de classe Tva : il n'y aurait plus à faire de recherche.

    Par exemple, au lieu d'écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            Article choufleur = new Article("Chou-fleur extra", 3.50, "tva3");
    Tu écrirais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            Article choufleur = new Article("Chou-fleur extra", 3.50, tva3);

    Remarque annexe : ce serait pas mal que tu respectes les conventions de nommage.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre très actif
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2006
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Mai 2006
    Messages : 174
    Par défaut
    Merci de ta réponse.

    Malheureusement, je ne m'en sorts toujours pas.

    Alors, en premier lieu pour répondre à la question de ce que j'ai le droit ou non d'utiliser, la réponse est tout ce que je peux (pas de contrainte)
    Je suis la pour m'amuser et rien d'autre, j'ai 70 ans et je cherche juste à comprendre ce qu'est une programmation objet, et l'uml.
    Je fait du java pour occuper mon temps…..

    En second lieu, pour ta remarque annexe :
    Remarque annexe : ce serait pas mal que tu respectes les conventions de nommage.
    Si tu peux m'en dire plus je suis preneur, de quoi tu me parles la ? et merci.

    Enfin pour mon problème, je pense que je n'ai pas de solution simple, donc, je vais utiliser comme dans le bon vieux temps un tableau de variable qui stockera mes 3 taux de TVA.


    Pour expliqué simplement, je croyais que de faire des objets tva1, tva2, tva3 serai plus simple. Je pensais que l'on pouvais appeler une méthode d'une objet, a partir d'un autre objet.

    Je pensais pouvoir appeler la méthode getTauxtva() de l'objet tva1 par exemple, à partir de l'objet choux fleur .

    en fait je m'aperçois que l'on ne peux pas écrire mavariable="tva1" et appeler la méthode par mavariable.getTauxtva(). mais si on écrit tva1.getTauxtva(), ca fonctionne.

    Il y a trop de choses que je n'ai pas encore comprises, alors je continue à creuser…..

    Merci encore

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par papilou86 Voir le message
    en fait je m'aperçois que l'on ne peux pas écrire mavariable="tva1" et appeler la méthode par mavariable.getTauxtva().
    Non, ça on ne peut pas directement en Java.


    Citation Envoyé par papilou86 Voir le message
    Je pensais que l'on pouvais appeler une méthode d'une objet, a partir d'un autre objet.
    Pour qu'un objet puisse invoquer une méthode d'un autre objet :
    1. il doit posséder une référence vers cet objet
      Pour le dire simplement, il doit y avoir une variable, directement ou indirectement (par l'intermédiaire d'un autre objet) dont la valeur est la référence de cet objet (on dirait "pointe" en C, mais en Java, ça ne se dit pas, on dit "référencer").

      Du point vue modélisation et isolation, il n'est pas très logique que Article ait une variable de type tableau/list/autre qui contiennent toutes les instances de Tva.

      Concrètement, utiliser un tableau, une List, une Map, etc, permettra de "convertir" le code de tva en objet Tva. On peut le faire en amont, donc ce que je te montrais :
      on a dans Article une variable de type Tva :
      une méthode pour l'affecter (un mutateur) :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      public void setTva(Tva tva) {
         this.tva=tva;
      }
      éventuellement une méthode pour la "lire" (un accesseur) :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      public Tva getTva() {
         return tva;
      }
      et on convertit le code par recherche au moment de construire l'objet ou de modifier le taux de TVA :


      On peut aussi le faire en aval, en stockant le code comme tu l'as fait et en passant l'objet qui référence toutes les tva en paramètre de la méthode getPrixTtc(), mais ça veut dire qu'à chaque fois qu'on va calculer le prix ttc on va chercher alors que dans le cas amont on va le faire uniquement au moment de l'affectation.

      Si ta liste est figée (pas chargée depuis une DB, on n'ajoute pas ni supprimer des taux), il y a aussi l'enum qui peut être une solution très simple et lisible.

      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 enum Tva {
        TVA1(1.20),
        TVA2(1.10),
        TVA3(1.055);
        private final double taux;
        private Tva(double taux) {
             this.taux=taux;
        }
        public double getTaux(double taux) {
             return taux;
        }
        public double getTva(double prixht) {
             return prixht*taux;
        }
        public double getPrixTtc(double prixht) {
             return prixht+getTva(prixht);
        }
      }
      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
      public class Article {
          /*...*/
          private Tva tva;
          public Article(String pnom, double pprix, Tva ptva) {
               /*...*/
               tva=ptva;
          }
          /*...*/
         public double getPrixTtc() {
                if ( tva!=null ) {
                   return tva.getPrixTtc(prix);
               }
               return prix;
         }
      }
      La construction :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      Article choufleur = new Article("Chou-fleur extra", 3.50, Tva.TVA3);
    2. la méthode doit être visible
      La visibilité (ou portée, ou scope) se définit par les mots private, public, protected, etc, et par la disposition entre les objets (deux iclasses du même package ou pas, une classe interne ou pas, une classe locale, anonyme, etc).



    Citation Envoyé par papilou86 Voir le message
    En second lieu, pour ta remarque annexe :
    Si tu peux m'en dire plus je suis preneur, de quoi tu me parles la ? et merci.
    Les conventions de nommage rendent un code plus facilement lisible et les différents éléments plus reconnaissables et donc plus rapidement compréhensibles, par l'habitude de les utiliser. On trouve la documentation officielle ici. En résumé :
    1. les noms de classe commencent par une majuscule, et on utilise le CamelCase (des majuscules aux séparations de mots)
    2. les noms de variables commencent par une minuscule, et on utilise le camelCase (des majuscules aux séparations de mots)
    3. les static final en majuscules, et on utilise le UPPER_CASE (des underscores aux séparations de mots)
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre très actif
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2006
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Mai 2006
    Messages : 174
    Par défaut
    Alors…. Comment dire ….
    Ben j'ai enfin réussi.

    Merci à toi, pour tes exemples, même si je n'ai pas toujours bien suivi ton raisonnement, tout cela ma fortement aidé.
    Merci encore.

    Je clos le fils de discussion.

    Voici mon exemple simplifié au maximum .

    la classe article :
    package article1;
    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
     
    class Article {
     
        private final String nom;
        private double prix;
        private Tva tva;
     
          public Article(String pnom, double pprix, Tva ptva) {
            this.nom = pnom;
            this.prix = pprix;
            this.tva = ptva;
        }
        public double getPrix() {
            return prix;
        }
        public String getNom() {
            return nom;
        }
        public String getTva() {
            return tva.getCodeTva();
        }
        public double getPrixTtc() {
                return prix*tva.getTauxTva();    
        }
         public void setPrix(double pprix) {
            prix = pprix;
        }
    }
    La Class TVA
    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
    package article1;
    class Tva {
     
        private String codeTva;
        private double tauxTva;
     
        public Tva(String pcodetva, double ptauxtva) {
            this.codeTva = pcodetva;
            this.tauxTva = ptauxtva;
        }
        public double getTauxTva() {
            return tauxTva;
        }
        public String getCodeTva() {
            return codeTva;
        }
        public void setTauxTva(double ptauxTva) {
            tauxTva = ptauxTva;
        }
        public void setCodeTva(String pcodeTva){
            codeTva = pcodeTva;
        }  
    }
    La Class main
    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
    package article1;
    public class main {
        public static void main(String[] args) {
     
            Tva tva1 = new Tva("t1",1.20);
            Tva tva2 = new Tva("t2",1.10);
            Tva tva3 = new Tva("t3",1.055);
     
            Tva matva;
            matva=tva3;
     
            double pprix;
            pprix=3.45;
     
            Article choufleur = new Article("Chou-fleur extra", pprix, matva);
            System.out.println("la tva de : " + choufleur.getNom()+ " est : " + choufleur.getTva()); 
            System.out.println("le prix ttc est de : " + choufleur.getPrixTtc()); 
        }
    }
    Les variables matva et pprix dans le main ne sont la que pour me prouver que je pouvais saisir des variables.

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

Discussions similaires

  1. [Débutant] objets avec noms variables
    Par rebel29270 dans le forum VB.NET
    Réponses: 8
    Dernier message: 13/09/2011, 08h39
  2. [Batch] Lancer un batch depuis un autre avec les variables du premier
    Par mr_samy81 dans le forum Scripts/Batch
    Réponses: 3
    Dernier message: 08/04/2009, 15h40
  3. [Système][Runtime] lancer une commade avec un PIP
    Par IVAGO dans le forum API standards et tierces
    Réponses: 18
    Dernier message: 19/08/2005, 19h49
  4. [FLASH MX2004] Lancer une anim avec des paramètres ??
    Par gchanteux dans le forum Flash
    Réponses: 4
    Dernier message: 23/03/2005, 17h49
  5. Lancer une methode a heure fixe
    Par Le Veilleur dans le forum C++Builder
    Réponses: 2
    Dernier message: 27/11/2004, 19h52

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