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 :

[POO] Heritage d'attribut statique surchargé !


Sujet :

Langage Java

  1. #1
    Membre régulier
    Avatar de Jaxofun
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    108
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 108
    Points : 84
    Points
    84
    Par défaut [POO] Heritage d'attribut statique surchargé !
    Salut a tous !

    je me cogne la tete sur un probleme de POO en java que j'ai rencontré. Je vous le soumet donc au cas ou vous auriez des idées :
    (J'aurai peut-être pu mettre ce poste dans la section POO mais c'est dans le cadre d'un application en Java, il peut donc y avoir quelque specificité)

    J'ai une classe abstraite "A" et ses sous classes.
    Je voudrais mettre en place un attribut qui serait dans toute les sous classes de A. Donc la meilleur chose à faire serait de le definir dans "A".
    Les sous-classes ne doivent pas être obligé d'instancier cet attribut. Donc l'attribut doit être instancié avec une valeur par défaut dans la classe A, donc l'attribut ne doit pas être abstract dans A.
    Mais comme les sous-classes de A peuvent fournir des valeurs différentes pour cette attribut, il faut aussi qu'elles puissent surcharger cet attribut.
    De plus, pour chacune des sous-classes de A, l'ensemble de ses instances auront la meme valeur pour cette attribut. Faut donc qu'il soit aussi static cet attribut, non ?

    Or l'heritage d'attribut static, et en plus surcharger, j'en ai pas trop entendu parler et ca devient fachement alambiqué ... : : :

    Donc si quelqu'un pouvait eclairer ma lanterne sur le sujet, voir me donner une solution qui permetterait de mettre en place ce type de structure en Java, ce serait sympa !
    Merci d'avance !

  2. #2
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 851
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 851
    Points : 3 481
    Points
    3 481
    Par défaut
    Tu pourrais aussi mettre un tableau static au niveau de ta classe A, avec une colonne par type de classe ?

    K
    K

  3. #3
    Membre régulier Avatar de nin2
    Profil pro
    Inscrit en
    Février 2005
    Messages
    100
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations forums :
    Inscription : Février 2005
    Messages : 100
    Points : 109
    Points
    109
    Par défaut
    A vrai dire, j'ai pas bien saisi ton problème ...

    Voilà ce que j'ai compris :

    tu créés un superclasse abstraite A qui définit un attribut static (n par exemple) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public abstract class A {
     
        protected static int n = 12;
     
        public int getN(){
            return n;
        }
     
        public abstract void setN(int newVal);
     
    }
    ensuite tu veux que les sous classes puissent modifier la valeur de cet attribut. Tu peux le faire soit dans le constructeur directement (si tu connais la valeur à priori), soit à l'aide d'une méthode qui modifie la valeur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public class A1 extends A {
     
        public A1(){
            n = 32;
        }
     
        public void setN(int newVal){
            n = newVal; 
        }
    }
    Il n'est ici pas question de "surcharge d'attribut static". Je sais pas trop ce que tu veux faire mais moi je ferais quelque chose comme ca.

    Test dans un main :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    A a = new A1();
            System.out.println(a.getN());
            a.setN(55);
            System.out.println(a.getN());
    Ce qui donne :

  4. #4
    Membre régulier
    Avatar de Jaxofun
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    108
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 108
    Points : 84
    Points
    84
    Par défaut
    Tout d'abord, merci pour ces reponses.

    KilVaiden > L'idée d'un tableau static est pas mal, me la garde sous l'coude d'ailleurs. Ce qui me gene c'est que cela devient compliqué pour savoir quel l'index du tableau correspond a chaque sous classe. Puis du coup c'est moins "objet" dans l'esprit, puisque une valeur specifique à une classe est definit dans sa classe mère.

    nin2 >
    Citation Envoyé par nin2
    A vrai dire, j'ai pas bien saisi ton problème ...
    C'est ... normal, mais pour ma defense je dirais que c'est assez compliqué à expliquer !
    En fait l'attribut doit être comme un attribut final static dans chaque sous classe. C'est à dire que pour chacune la valeur est bien précisée depuis le départ et ne change pas. Quand je disais que les sous classe modifiait la valeur de l'attribut c'etait au sens de l'heritage et non pas dynamiquement.

  5. #5
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 851
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 851
    Points : 3 481
    Points
    3 481
    Par défaut
    Rien ne t'empêche du coup dans chacune de tes sous classes d'avoir un attribut static représentant l'index du tableau présent au niveau static de ta classe A

    Ce n'est pas si contraire à l'approche objet : ta classe A peut très bien définir les différents attributs possibles pour les sous classes, et chacune d'entres-elles connait son propre index pour y accéder. Ca me parrait être une bonne solution, je n'en vois pas d'autres, mais peut-être qu'il y a mieux !

    K
    K

  6. #6
    Membre régulier Avatar de nin2
    Profil pro
    Inscrit en
    Février 2005
    Messages
    100
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations forums :
    Inscription : Février 2005
    Messages : 100
    Points : 109
    Points
    109
    Par défaut
    C'est bien ce qui me semblait, je n'avais pas compris ...

    L'histoire du tableau avec une colonne par type de classe, ca me semble pas top niveau maintenance du code. Si tu rajoute un nouveau type par héritage, tu es obligé de modifier le code de ta superclasse ... C'est moyen à mon avis

  7. #7
    Membre régulier
    Avatar de Jaxofun
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    108
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 108
    Points : 84
    Points
    84
    Par défaut
    Tout a fait d'accord, mais bon au moins ça a le merite de fonctionner.

  8. #8
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 851
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 851
    Points : 3 481
    Points
    3 481
    Par défaut
    En réfléchissant un peu je viens d'entrevoir une solution plus "propre".

    Tu peux déclarer cet attribut en abstract static au niveau de ta classe A.
    Puis au niveau de chacune des sous-classes, tu l'initialises dans un bloc "static".
    Il me semble que le fait qu'il soit déclaré en abstract dans ta classe A, implique le fait qu'il sera spécialisé pour chacune de tes sous-classes, donc que pour chacune d'elle il aura une valeur unique, bien que static.

    A tester..

    K
    K

  9. #9
    Membre régulier
    Avatar de Jaxofun
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    108
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 108
    Points : 84
    Points
    84
    Par défaut
    Citation Envoyé par KilVaiden
    Rien ne t'empêche du coup dans chacune de tes sous classes d'avoir un attribut static représentant l'index du tableau présent au niveau static de ta classe A
    En y repensant, c'est le chien qui se mord la queue, car dans ce cas autant mettre mon attribut directement de cette façon.

  10. #10
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 851
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 851
    Points : 3 481
    Points
    3 481
    Par défaut
    Oui je pense que j'ai "inventé" cette rustine, du fait que dans ton poste original tu disais qu'il ne fallait pas que cet attribut soit défini en abstract, hors il n'y a aucune raison à cette restriction, si ?

    K
    K

  11. #11
    Membre régulier Avatar de nin2
    Profil pro
    Inscrit en
    Février 2005
    Messages
    100
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations forums :
    Inscription : Février 2005
    Messages : 100
    Points : 109
    Points
    109
    Par défaut
    Je pense que je comprend un peu mieux la problématique ...

    Et du coup, la méthode proposée par KilVaiden dans son dernier post me semble pas mal ! Bien vu le coup du bloc "static" ...

  12. #12
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 851
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 851
    Points : 3 481
    Points
    3 481
    Par défaut
    En plus c'est la fin de la journée/semaine hein, faut pas trop m'en vouloir, je me prépare à un petit week-end de 3 jours !! hehe

    K
    K

  13. #13
    Membre régulier
    Avatar de Jaxofun
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    108
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 108
    Points : 84
    Points
    84
    Par défaut
    Hum... désolé, on va pas sabrer le champagne de suite !
    Une autre des contraintes, c'est que chaque sous classe n'est pas obligé de spécifié la valeur de cet attribut et dans ce cas là c'est la classe mere abstraite qui fournie la valeur par defaut de l'attribut pour cette classe.
    C'était pour ça que j'avait dis que c'etait pas possible avec abstract et qui faudrait surcharger.

  14. #14
    Membre régulier Avatar de nin2
    Profil pro
    Inscrit en
    Février 2005
    Messages
    100
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations forums :
    Inscription : Février 2005
    Messages : 100
    Points : 109
    Points
    109
    Par défaut
    Mouais ...
    Là il faudrait que tu m'expliques un peu le but de ce que tu veux faire. Parce que là je vois pas trop à quoi ca peut servir ... Si tu peux exposer un peu mieux le contexte de ce que tu fais ... si ca se trouve, il y a une autre façon de voir les choses et du coup une autre solution complètement différente pour mettre en oeuvre ce que tu veux faire !

  15. #15
    Membre régulier
    Avatar de Jaxofun
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    108
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 108
    Points : 84
    Points
    84
    Par défaut
    Pour mieux vous representer la chose je vous explique le cas concret :

    Dans une appli J2EE, avec Struts, j'utilise des classe Action. Et toute mes classes action sont sous classe d'une super classe Action abstraite (ce qui me permet d'effectuer des operations communes a toute les actions).

    Et entre autre la gestion des droits d'acces :
    Chaque utilisateur a un parametre profil. Et je veux fixer pour chaque classe action la liste des profils qui sont autorisés à l'effectuer. Donc mon attribut c'est une ArrayListe contenant les profils autorisés a effectuer cette action.
    Or pour beaucoup d'action tout les profils sont autorisé (partie du site non privé/securisé) donc pour eviter de devoir definir l'arrayListe dans toute ces actions, je voulais definir dans ma super classe que l'arrayListe contient tout les profils. Ainsi je n'aurais besoin de definir un nouvel arrayList que pour les action privés/sécurisés.

  16. #16
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 109
    Points : 122
    Points
    122
    Par défaut
    Tu peux faire un attribut d'instance privé, sans méthode set et que tu initialise toujours à la même valeur dans ton constructeur.

    Au passage, static et abstract sont exclusifs... quant aux attributs abstract, ça n'existe pas !

  17. #17
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 851
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 851
    Points : 3 481
    Points
    3 481
    Par défaut
    Donc en gros, c'est un attribut qui a une valeur par défaut ( celle de la classe A, toujours la même ? ) et qui peut être spécialisée pour chacune des sous-classes ?

    Par exemple ( en schématisant ) :

    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
     
     
    class A {
      static final int attributParDefaut = 1;
    }
     
    class B extends A {
     
      static int attribut;
     
      static {
         attribut = A.attributParDefaut;
      }
     
      // puis rien ne t'empêche de modifier cet "attribut" par la suite
     
    }
    K
    K

  18. #18
    Membre régulier Avatar de nin2
    Profil pro
    Inscrit en
    Février 2005
    Messages
    100
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations forums :
    Inscription : Février 2005
    Messages : 100
    Points : 109
    Points
    109
    Par défaut
    Une idée :

    Dans ta classe abstraite, tu définis une variable static mais pas abstraite, nommée DefaultProfiles et qui contient l'ensemble des profils utilisateurs.

    Tu ajoute aussi une autre variable statique, mais abstraite ce coup ci, nommée AuthorizedProfiles, qui indique l'ensemble des profils utilisateur autorisés à effectuer l'action.

    Ensuite tu redéfinis cette variable "static abstract" dans chacune de tes sous classes concrètes. Soit tu l'initialise avec la valeur DefaultProfiles de la superclasse, soit tu l'initialises avec les profils que tu veux à l'aide d'un bloc static ...

    à tester ! si ca se trouve je dis une énorme connerie (Normal, c'est la fin de semaine !)

  19. #19
    Membre averti
    Avatar de JHelp
    Inscrit en
    Octobre 2002
    Messages
    185
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 185
    Points : 444
    Points
    444
    Par défaut
    Bonjour,
    La surcharge d'un champs statique n'est pas possible, pour le différencier selon le type de classe, il n'y a que malheureusement que le coup du tableau classe <-> valeur. Simplement parceque c'est le même champs static qui est partagé par la classe et sous classe, le même pointeur si tu veux. Mais bon si tu nous en disais un peu plus sur le but, comme le disais nin2 y a peut être une solution plus propre à ce que tu veux faire.
    JHelp
    Pour avoir une réponse efficace :
    1) Soyez précis dans vos questions
    2) Choisssez bien votre forum
    3) Consultez la FAQ et la doc avant

  20. #20
    Membre régulier Avatar de nin2
    Profil pro
    Inscrit en
    Février 2005
    Messages
    100
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations forums :
    Inscription : Février 2005
    Messages : 100
    Points : 109
    Points
    109
    Par défaut
    C'est bien ce qui me semblait, j'ai dit une connerie. Un attribut abstract, c'est pas possible. Désolé

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [Access] select heritage selon attribut
    Par Bapt.ice dans le forum Langage SQL
    Réponses: 8
    Dernier message: 25/04/2006, 16h25
  2. [POO] Héritage multiple Parent
    Par djshaker dans le forum Langage
    Réponses: 15
    Dernier message: 15/03/2006, 17h35
  3. [POO] retourner les attributs d'une classe
    Par ozzmax dans le forum Langage
    Réponses: 10
    Dernier message: 12/01/2006, 00h10
  4. [POO] Objet en attribut d'un objet
    Par Tchinkatchuk dans le forum Langage
    Réponses: 7
    Dernier message: 06/12/2005, 10h00
  5. Réponses: 7
    Dernier message: 18/10/2005, 12h50

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