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 :

Etendre dynamiquement une classe avec héritiers


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2008
    Messages : 179
    Par défaut Etendre dynamiquement une classe avec héritiers
    Bonjour,

    je ne savais trop comment formuler mon titre donc j'espère que l'explication ci-dessous sera plus claire.

    Je possède une arborescence de classes issues de ma couche "model", branchée en hibernate.

    Elle ressemble à celà :

    Support
    ├───────┐
    Message Annonce
    ├────┬──┐
    Mail Vocal Sms


    A un moment donné, je veux utiliser une liste de supports étendus en rajoutant un attribut "selected" (+getter/setter) à mes "Support"

    Qqchose du genre
    public Class ExtendedSupport extends Support{ boolean selected ...}

    Mon problème est que ExtendedSupport ne me permet plus de stocker des objets (ou peut-être est-ce là ma première erreur?) hérités de support (de type Message ou Annonce).
    A moins de me tromper donc, je ne peux pas faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ExtendedSupport e = new Sms();
    J'ai pourtant besoin de réaliser une extension de ma classe mère sans toucher à celle-ci, et de pouvoir appeler sur une List<ExtendedSupport> la méthode propre à chaque objet "stocké" dans cette liste.... et c'est là que je pêche.
    En gros, j'aurais besoin de faire qqchose du genre (incorrect en l'occurence):

    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
     
    @Entity
    @Table(name="support")
    @Inheritance(strategy=InheritanceType.JOINED)
    @DiscriminatorColumn(name="DTYPE")
    public Class Support {
        // plein d'attributs + getters/setters
        public abstract void doSomething(); // propre à chaque héritier
    }
    ...
    public Class ExtendedSupport extends Support{
        private boolean selected; // + getter/setter
    }
     
    ...
    List<ExtendedSupport> allExtendedSupports ;
    public void monInit{
        List<Support> allSupports = supportService.getAllSupports();
        allExtendedSupports = new ArrayList()<>;
     
        for(Support support : allSupports ){
            ExtendedSupport e = support;
            e.setSelected(true);
            allExtendedSupports.add(e);
        }
    }
    ...
     
    uneAutreMethode(){
        for(ExtendedSupport support : allExtendedSupports ){
            support.doSomething();
        }
    }
    Voilà.... j'espère que j'ai été clair.
    Si un expert a une idée?

    PS : j'ai bien pensé à recopier le résultat des méthodes propres à chaque objet hérité de support dans la nouvelle instance de "ExtendedSupport", mais ça représente beaucoup de méthodes, et surtout le résultat peut changer entre la méthode "monInit" et "uneAutreMethode".
    Je ne peux pas non plus modifier ma classe mère (interdiction de toucher au modèle!).

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Tu dois simplement changer ta classe MessageAnnonce pour qu'elle étende ExtendedSupport et non plus Support.

  3. #3
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2008
    Messages : 179
    Par défaut
    Merci de ta réponse.
    J'ai omis de préciser que l'ensemble du modèle est immuable.
    Je ne peux que créer une classe tiers qui étend une classes de mon modèle (ou une interface, ou quoi que ce soit d'autre).

  4. #4
    Membre régulier
    Homme Profil pro
    Développeur Java
    Inscrit en
    Août 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Transports

    Informations forums :
    Inscription : Août 2012
    Messages : 8
    Par défaut
    Une suggestion en posant un attribut de type Support dans une classe-fille de Support :
    (idée basée sur le principe du modèle de conception décorateur, avec dans cet exemple une seule décoration possible)

    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 ExtendedSupport extends Support
    {
       private Support support;   //// A priori, pas besoin des accesseurs/modifieurs en public
       private boolean selected;
     
       public ExtendedSupport (Support s)
       {
           this.support = s;
       }
     
       public void doSomething ()
       {
          support.doSomething();
       }
    }
    Ta boucle d'initialisation deviendrait alors :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    for(Support support : allSupports )
    {
        ExtendedSupport e = new ExtendedSupport(support);
        e.setSelected(true);
        allExtendedSupports.add(e);
    }

  5. #5
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2008
    Messages : 179
    Par défaut
    Merci de ta réponse.

    Dans ta proposition, l'héritage de support n'a plus vraiment d'intérêt du coup... ça aurait même tendance à dupliquer des attributs de classe.
    Autant faire une classe qui hérite simple d'Object il me semble (à moins que qqchose ne m'échappe?).

    Cependant la solution, même si elle m'oblige a rajouter un objet intermédiaire pour récupérer mes attributs, me paraît valable. Je la mets pour l'instant en tête de ma liste (même si elle y est seule pour l'instant!)

    Je vais également jeter un oeil au patron que tu cites... en voilà un que je ne connaissais pas!

  6. #6
    Membre régulier
    Homme Profil pro
    Développeur Java
    Inscrit en
    Août 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Transports

    Informations forums :
    Inscription : Août 2012
    Messages : 8
    Par défaut
    Citation Envoyé par Roger_Rabbit Voir le message
    Dans ta proposition, l'héritage de support n'a plus vraiment d'intérêt du coup... ça aurait même tendance à dupliquer des attributs de classe.
    Autant faire une classe qui hérite simple d'Object il me semble (à moins que qqchose ne m'échappe?).
    Là, c'est toi qui sais : as-tu besoin qu'un ExtendedSupport soit un Support dans le reste de ton application ?

    (C'est vrai que le décorateur met plus en scènes des interfaces que des classes, en tous cas en haut de l'arbre d'héritage)

  7. #7
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Citation Envoyé par Roger_Rabbit Voir le message
    Merci de ta réponse.
    J'ai omis de préciser que l'ensemble du modèle est immuable.
    Je ne peux que créer une classe tiers qui étend une classes de mon modèle (ou une interface, ou quoi que ce soit d'autre).
    Dans ce cas, a part des wrappers autour de tes instances, je ne vois pas de solution.

    Mais bon 'ajouter une propriété' c'est une moyen, incompatible dans le fond avec la notion d'immuabilité. C'est quoi le besoin derrière? Il y a peut être d'autres solutions.

    Si le but est de savoir si un objet a été coché sur une interface particulière, il faut mieux effectivement stocker ces informations dans une autre classe, par exemple avec un Set<Support> qui contient tous les éléments cochés.

Discussions similaires

  1. Etendre une classe avec HttpServlet impossible
    Par SpeedOverflow dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 22/11/2011, 09h59
  2. Comment faire une connexion dynamique à une base avec ADO?
    Par Borisam dans le forum Bases de données
    Réponses: 2
    Dernier message: 22/03/2006, 14h22
  3. est il possible de créer dynamiquement une class ???
    Par SpaceFrog dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 12/07/2005, 16h22
  4. Réponses: 5
    Dernier message: 26/05/2005, 15h40
  5. [MFC] Créer dynamiquement une classe
    Par vanitom dans le forum MFC
    Réponses: 9
    Dernier message: 11/12/2004, 13h23

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