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 :

[héritage] héritage d'une variable static


Sujet :

Langage Java

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 9
    Points : 5
    Points
    5
    Par défaut [héritage] héritage d'une variable static
    Bonjour,

    J'ai une classe Prestation qui contient, entre autres, une variable static ListePrestations et des méthodes static pour gérer cette variable.

    J'ai ensuite des classes qui héritent de Prestation (Epilation, SoinVisage...). Je souhaite avoir pour chacune de ces classes filles une variable static (ListeEpilations, ListeSoinsVisage...) et des méthodes static pour gérer cette variable (les mêmes méthodes que dans Prestation).

    Mon idée me dit qu'avec l'héritage, j'ai une variable static ListePrestations pour chacune de ces classes filles ; et que les méthodes elles-aussi sont héritées.

    Le problème est que, quand je teste, je me rends compte qu'il n'y a qu'une seule variable static ListePrestations qui liste toutes les instances des classes filles de la classe Prestation. Ce n'est donc pas ce que je veux.

    Est-ce que vous savez si c'est possible d'avoir par héritage une variable static pour chaque classe fille sans avoir à en créer une dans chacune d'elles, ni à réécrire les méthodes static qui accèdent à cette variable ?

    Merci d'avance.

  2. #2
    Membre éprouvé
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    Points : 1 085
    Points
    1 085
    Par défaut
    J'ai rien compris .....

    Faut dire que j'ai la tête dans le gaz...

    Que veux tu faire exactement... une vartiable statique pour chaque sous classe...

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Oui, c'est cela, une variable static pour chaque sous-classe.
    Chaque variable en question étant la liste des instances de la sous-classe.
    Les méthodes static gèrent cette variable.

    Et je souhaite, si possible, déclarer cette variable et ces méthodes dans la classe mère (c'est la même chose pour chaque sous-classe) au lieu de recopier le code dans chaque sous-classe.

    Actuellement, j'ai une variable static, celle déclarée dans la classe mère, qui contient toutes les instances des sous-classes ; ce qui n'est pas ce que je cherche à avoir.

  4. #4
    Membre actif Avatar de austin P.
    Inscrit en
    Juin 2004
    Messages
    182
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Juin 2004
    Messages : 182
    Points : 239
    Points
    239
    Par défaut
    tu peux mettre un peu de code
    En essayant continuellement on finit par réussir. Donc : plus ça rate, plus on a de chance que ça marche. (Jacques Rouxel : "Les shadoks")

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Voici la classe Prestation :

    import java.util.*;

    public class Prestation {

    protected String nom;

    protected int duree_heures;

    protected int duree_minutes;

    protected String tarif;

    public static Vector ListePrestations;

    /** Creates a new instance of Prestation */
    public Prestation() {
    }

    public Prestation(String p_nom,
    int p_duree_heures,
    int p_duree_minutes,
    String p_tarif) {
    nom = p_nom;
    duree_heures = p_duree_heures;
    duree_minutes = p_duree_minutes;
    tarif = p_tarif;
    }

    /* Getters et Setters enlevés ici */

    public String toString () {
    return nom;
    }

    public static void initialiserListePrestations() {
    ListePrestations = new Vector ();
    }

    public static Vector RechercherPrestations () {
    return ListePrestations;
    }

    public static Vector RechercherPrestations (String p_nom) {
    Vector result ;
    boolean nom_ok;
    Prestation une_prestation ;
    if (p_nom.length()==0) {
    result = ListePrestations;
    }
    else {
    result = new Vector();
    for (int i=0;i<ListePrestations.size();i++) {
    nom_ok = true;
    une_prestation = (Prestation) ListePrestations.elementAt(i);
    if (! une_prestation.getNom().toUpperCase().startsWith(p_nom.toUpperCase())) {
    nom_ok = false;
    }
    if (nom_ok) {
    result.addElement(ListePrestations.elementAt(i));
    }
    }
    }
    return result;
    }

    public static void supprimerPrestation (Prestation p_la_prestation) {
    ListePrestations.removeElement(p_la_prestation);
    }

    public static void creerPrestation (Prestation p_la_prestation) {
    ListePrestations.addElement(p_la_prestation);
    }
    }



    Une classe fille :

    import java.util.*;
    public class Epilation extends Prestation {

    /** Creates a new instance of Epilation */
    public Epilation() {
    }

    public Epilation(String p_nom,
    int p_duree_heures,
    int p_duree_minutes,
    String p_tarif) {
    super(p_nom,p_duree_heures, p_duree_minutes, p_tarif);
    }
    }


    Une autre classe fille :


    public class SoinVisage extends Prestation {

    /** Creates a new instance of SoinVisage */
    public SoinVisage() {
    }

    public SoinVisage(String p_nom,
    int p_duree_heures,
    int p_duree_minutes,
    String p_tarif) {
    super(p_nom,p_duree_heures, p_duree_minutes, p_tarif);
    }
    }


    Dans le main, j'ai ceci :

    Epilation mon_epilation = new Epilation("demi_jambes",0,15,"15");
    Epilation.creerPrestation(mon_epilation);

    SoinVisage mon_soin_visage = new SoinVisage("coup d éclat",0,15,"15");
    SoinVisage.creerPrestation(mon_soin_visage);


    Dans mon IHM qui liste les épilations :

    protected void initListe () {
    // Initialisation - pas de critères de recherche.
    la_liste.clear(); // la_liste est d'une classe ListModel qui extends DefaultListModel
    Vector result = Epilation.RechercherPrestations();
    for (int i=0;i<result.size();i++) {
    la_liste.addElement((Prestation) result.elementAt(i));
    }
    liste_prestations.setModel(la_liste); // liste_prestations est une JLIST
    }



    A l'affichage de l'ihm, j'ai 2 éléments :

    - demi_jambes
    - coup d éclat

    Alors que je ne veux que demi-jambes.


    Même chose pour l'ihm qui affiche les soins visages où je ne veux que coup d éclat.

  6. #6
    Membre habitué Avatar de Piolet
    Inscrit en
    Février 2004
    Messages
    469
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 469
    Points : 160
    Points
    160
    Par défaut
    euh juste comme ca...pkoi tu fais des méthodes static qui prenne en argument une prestation...pkoi la faire static...
    si tu fait ca c bcp mieux non ? :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Epilation mon_epilation = new Epilation("demi_jambes",0,15,"15"); 
    mon_epilation.creerPrestation(); 
     
    SoinVisage mon_soin_visage = new SoinVisage("coup d éclat",0,15,"15"); 
    mon_soin_visage.creerPrestation();
    comme ca pas besoin de variable et méthode static...comme ca tu es sure que la liste que tu vas héritée sera propre a chaque classe fille...
    Hum hum hum...géant vert ! ! !
    Le meilleur moyen de trouver c encore de chercher ! ! !

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    ok pour les méthodes.

    Mais je ne vois pas comment avoir une variable qui liste mes instances sans la déclarer static. creerPrestation va ajouter dans cette variable.

  8. #8
    Membre habitué Avatar de Piolet
    Inscrit en
    Février 2004
    Messages
    469
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 469
    Points : 160
    Points
    160
    Par défaut
    euh attends je reprends ton code et j'en t'en fais un mieux

    bouges pas
    Hum hum hum...géant vert ! ! !
    Le meilleur moyen de trouver c encore de chercher ! ! !

  9. #9
    Membre habitué Avatar de Piolet
    Inscrit en
    Février 2004
    Messages
    469
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 469
    Points : 160
    Points
    160
    Par défaut
    Voici la classe Prestation :

    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
     
    import java.util.*; 
     
    public class Prestation extends Vector { 
       protected String nom; 
       protected int duree_heures; 
       protected int duree_minutes; 
       protected String tarif; 
     
       /** Creates a new instance of Prestation */ 
       public Prestation() {} 
     
       public Prestation(String p_nom, int p_duree_heures, int p_duree_minutes, String p_tarif) { 
          this();
          nom = p_nom; 
          duree_heures = p_duree_heures; 
          duree_minutes = p_duree_minutes; 
          tarif = p_tarif; 
       } 
     
       /* Getters et Setters enlevés ici */ 
       public String toString () { 
          return nom; 
       } 
     
       public static Vector searchPrestations () { 
          return (Vector) this; 
       }
     
       public Vector searchPrestations (String p_nom) { 
          Vector result ; 
          boolean nom_ok; 
          Prestation une_prestation ; 
          if (p_nom.length()==0) { 
             result = (Vector) this; 
          } else { 
             result = new Vector(); 
             for (int i=0;i<listePrestations.size();i++) { 
                nom_ok = true; 
                une_prestation = (Prestation) this.elementAt(i); 
                if (! une_prestation.getNom().toUpperCase().startsWith(p_nom.toUpperCase())) { 
                   nom_ok = false; 
                } 
                if (nom_ok) { 
                   result.addElement(this.elementAt(i)); 
                } 
             } 
          } 
          return result; 
       } 
     
       public void supprimerPrestation (Prestation p_la_prestation) { 
          this.remove(p_la_prestation); 
       } 
     
       public void creerPrestation (Prestation p_la_prestation) { 
          this.add(p_la_prestation); 
       } 
    }

    Une classe fille :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    import java.util.*; 
    public class Epilation extends Prestation { 
     
       /** Creates a new instance of Epilation */ 
       public Epilation() {} 
     
       public Epilation(String p_nom, int p_duree_heures, int p_duree_minutes, String p_tarif) { 
          super(p_nom,p_duree_heures, p_duree_minutes, p_tarif); 
       } 
    }
    Une autre classe fille :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public class SoinVisage extends Prestation { 
     
       /** Creates a new instance of SoinVisage */ 
       public SoinVisage() {} 
     
       public SoinVisage(String p_nom, int p_duree_heures, int p_duree_minutes, String p_tarif) { 
          super(p_nom,p_duree_heures, p_duree_minutes, p_tarif); 
       } 
    }
    Dans le main, j'ai ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Epilation mon_epilation = new Epilation("demi_jambes",0,15,"15"); 
     
    SoinVisage mon_soin_visage = new SoinVisage("coup d éclat",0,15,"15");
    et dans ton IHM :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    protected void initListe () { 
       // Initialisation - pas de critères de recherche. 
       la_liste.clear(); // la_liste est d'une classe ListModel qui extends DefaultListModel 
       Vector result = mon_epilation.RechercherPrestations(); 
       for (int i=0;i<result.size();i++) { 
          la_liste.addElement((Prestation) result.elementAt(i)); 
       } 
       liste_prestations.setModel(la_liste); // liste_prestations est une JLIST 
    }
    aucune variable static, j'alège meme le code, en héritant direct de Vector...et chaque classe fille aura sa propre liste de prestations...c bien comme ca non ?
    Hum hum hum...géant vert ! ! !
    Le meilleur moyen de trouver c encore de chercher ! ! !

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Mais on dirait que chaque instance de la classe Epilation (par exemple) sera un Vector. Où est ma liste des instances d'Epilation ? Peut-être que je ne comprends pas ton code, je ne suis pas un expert en java. Ce que je comprends, c'est que chaque instance sera un Vector, et qu'en je fais searchPrestations, ça me cherche les prestations qui sont dans le Vector de l'instance en question.

    Ce que je peux faire sinon, c'est faire une classe ListePrestations extends Vector, et créer une instance de cette classe pour chaque sous-classe de Prestation.

    Mais par curiosité, j'aimerais savoir si je peux faire avec une variable static à chaque classe fille, en la déclarant dans la classe mère.

  11. #11
    Membre habitué Avatar de Piolet
    Inscrit en
    Février 2004
    Messages
    469
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 469
    Points : 160
    Points
    160
    Par défaut
    disons que dans mon code, j'ai tenté d'eviter la création de variable inutile...dans le sens ou visiblement chaque prestation sera une liste de prestation ou de service...enfin bref...donc je me suis dit autant dire que c un vector directement plutot que de créer un vector dedans...mais bon tu peux le faire comme tu le sens

    maintenant les variables static plus tu peux éviter mieux c, je ne dis pas kil ne faut pas s'en servir, mais faire des variables static juste pour dire qu'elles sont static...autant faire de l'ADA et arreter de coder en objet (j'ai dit ADA comme j'aurais pu dire FORTRAN ou meme de l'assembleur)

    si tu mets des trucs en static qui n'ont pas lieu d'etre en static...c pas glop voila tout...mais tu es libre de le faire comme tu veux...
    Hum hum hum...géant vert ! ! !
    Le meilleur moyen de trouver c encore de chercher ! ! !

  12. #12
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Je crois qu'on ne s'est pas très bien compris (pô grave) :
    "dans le sens ou visiblement chaque prestation sera une liste de prestation ou de service".
    Une prestation est une prestation, c'est tout. Il y a des types de prestations, qui sont les sous-classes. La liste en question, c'est la liste des prestations qu'il y a, en faisant une liste par type de prestations, donc une liste par sous classe.[/code]

  13. #13
    Membre habitué Avatar de Piolet
    Inscrit en
    Février 2004
    Messages
    469
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 469
    Points : 160
    Points
    160
    Par défaut
    oui c pÔ grÂve

    bah c ton nommage des variables qui doit pas etre tres clair...
    mais grosso modo, peu importe si c une liste de patate ou de choux...c une liste...donc c pour ca que je faisait hérité de vector mais maintenant si c pas une liste ...oui y a pas de raison d'herité de Vector...enfin bref...sinon pour la variable static, logiquement tu n'as aucune raison, dans ton code la, de déclaré une variable static...tu peux tout faire sans static...
    Hum hum hum...géant vert ! ! !
    Le meilleur moyen de trouver c encore de chercher ! ! !

  14. #14
    Membre éprouvé
    Profil pro
    Développeur Back-End
    Inscrit en
    Avril 2003
    Messages
    782
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Back-End

    Informations forums :
    Inscription : Avril 2003
    Messages : 782
    Points : 935
    Points
    935
    Par défaut
    l'héritage de méthode static n'est hélas pas possible par contre dans ta classe Prestation tu peux faire une méthode static du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public static Vector rechercherPrestations(Class typePrestation){
    	Vector retour = new Vector();
    	for(Iterator ite=liste.iterator();ite.hasNext();){
    		Object obj=ite.next();
    		if(typePrestation.isAssignableFrom(obj.getClass())){
    			retour.add(obj);
    		}
    	}
    	return retour;
    }
    et l'appel se fera par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Vector result = Prestation.rechercherPrestations(Epilation.class);

  15. #15
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Cool, ça marche comme ça et c'est simple à mettre en place.

    Merci.

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

Discussions similaires

  1. Remettre à zero une variable static
    Par Mchupakabra dans le forum Langage
    Réponses: 1
    Dernier message: 09/06/2008, 19h57
  2. Problème avec une variable static
    Par Kevin12 dans le forum Général Java
    Réponses: 2
    Dernier message: 05/05/2008, 17h20
  3. comment importer une variable static
    Par Asmod_D dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 29/03/2007, 14h55
  4. [POO] Problème avec une variable static
    Par grimsk dans le forum Langage
    Réponses: 5
    Dernier message: 23/05/2006, 01h58
  5. [VB6]Initialiser une variable Static dans un évenement
    Par loverdose dans le forum VB 6 et antérieur
    Réponses: 16
    Dernier message: 20/01/2005, 14h57

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