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 :

[1.5] Vector et héritage


Sujet :

Langage Java

  1. #1
    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 [1.5] Vector et héritage
    Bonjour,

    alors, je vais essayer de faire clair.
    Mon problème est le suivant :

    • J'ai une classe, Controller pour ne pas la nommer, qui fait plein de choses, gère des évènements sur ses propriétés etc...bref...qq truc sympas qui m'evite de les refaires a chaque fois. Cette classe n'est pas abstraite, (mais a priori, si besoin elle peut le devenir

    • J'ai une autre classe, ControllerList qui, elle, hérite de Vector<Controller>.
      j'ai réimplémenté qq méthodes, comme add et remove, pour y rajouter un comportement particulier.

    tout ca marche très bien, mais la ou ca fait ce que je veux, c'est quand je fais une classe qui hérite de mon Controller, par exemple MyController, sur laquelle je rajoute qq méthodes mais le fonctionnement de l'objet reste le meme que celui d'un Controller, et une autre classe qui hérite de mon ControllerList, MyControllerList.

    En fait j'aimerais que MyControllerList soit en fait un ControllerList<MyController> pour que quand je fasse ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    MyControllerList myList = new MyControllerList();
    MyController controller = new MyController();
    myList.add(controller);
     
    //a la récupération je veux pouvoir récupérer un MyController directement, 
    //sans cast, comme ceci :
    controller = myList.get(0);
     
    //or la je suis obligé de casté, car MyControllerList héritant de ControllerList,
    //il me renvoie constament un Controller
    controller = (MyController) myList.get(0);
    voila...en gros je veux éviter le cast, en profitant de l'héritage de ControllerList.

    Je sais pas si j'ai été tres clair

    voila merci d'avance
    Hum hum hum...géant vert ! ! !
    Le meilleur moyen de trouver c encore de chercher ! ! !

  2. #2
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Points : 5 943
    Points
    5 943
    Par défaut
    Depuis Java 1.5 il est possible de modifier le type de retour d'une méthode redéfinie, cf La covariance dans le JDK1.5.

    Il te suffit donc de redéfinir la méthode get() de la classe MyControllerList.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    @Override
    public MyController get(int index) {
        return (MyController) super.get(index);
    }
    Par contre attention aux diverses méthodes d'ajout qui permettent toujours d'ajouter un Controller qui n'est pas un MyController ce qui déclencherait une erreur lors de la récupération de l'élément.
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  3. #3
    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
    je voulais justement eviter de redefinir chaque méthode de l'héritant, je pensais qu'avec la definition bien faite, ca suffirait a faire en sorte que le get me renvoie le bon objet.

    mais si c'est la seule méthode...
    Hum hum hum...géant vert ! ! !
    Le meilleur moyen de trouver c encore de chercher ! ! !

  4. #4
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Points : 5 943
    Points
    5 943
    Par défaut
    Ce que tu peux faire c'est laisser les générics au type ControllerList.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ControllerList<T extends Controller> extends Vector<T>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MyControllerList extends ControllerList<MyController>
    Ce qui donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    MyControllerList myList = new MyControllerList();
    MyController controller = new MyController();
    myList.add(controller);
    controler = myList.get(0);
    ou si tu veux pouvoir étendre MyControllerList :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MyControllerList<T extends MyController> extends ControllerList<T>
    Ce qui donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    MyControllerList<MyController> myList = new MyControllerList<MyController>();
    MyController controller = new MyController();
    myList.add(controller);
    controler = myList.get(0);
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  5. #5
    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
    voila..c'est ca que j'ai essayé et qui n'a pas marché....mais ma syntaxe ne devait pas etre bonne...

    merci bcp...j'essaie ca des que possible
    Hum hum hum...géant vert ! ! !
    Le meilleur moyen de trouver c encore de chercher ! ! !

  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
    alors voila ce que ca me fait, parce que moi, dans mon ControllerList j'ai redefini qq methodes comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    @Override
    public Controller remove(int index) {
       Controller controller = this.get(index);
       controller.setState(State.DELETED);
       return controller;
    }
    alors que j'ai bien mis la signature de ControllerList comme tu précisais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ControllerList<T extends Controller> extends Vector<T>
    il va me donner ca comme erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Multiple markers at this line
    -the return type is incompatible with Vector<T>.remove(int)
    -overrides java.util.Vector<T>.remove
    et si je dis a ma méthode remove de renvoyer un objet de type T, bah...il admet pas que je fasse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    @Override
    public T remove(int index) {
       Controller controller = this.get(index);
       controller.setState(State.DELETED);
       return controller;
    }
    parce que controller n'est pas de type T..normal
    Hum hum hum...géant vert ! ! !
    Le meilleur moyen de trouver c encore de chercher ! ! !

  7. #7
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Si tu utilises le type abstrait T tu dois l'utiliser partout :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    @Override
    public T remove(int index) {
       T controller = this.get(index);
       controller.setState(State.DELETED);
       return controller;
    }

    a++

  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
    ah bah oui...ca passe mieux
    nickel merci bcp
    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
    alors vais faire mon chieur

    ca marche nickel dans la déclaration, par contre a l'utilisation...j'ai qq soucis...

    alors comment expliquer

    par exemple :

    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
     
    //Controller est un peu comme ca
    class Controller {
       private Hashtable<String, Controller> _children;
       private Hashtable<String, ControllerList> _childrenList;
     
       public void addChildren(String name, Contoller controller) {
          this._children.put(name, controller);
       }
     
       public void addChildrenList(String name, ContollerList controllerList) {
          this._childrenList.put(name, controllerList);
       }
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    class Consultations<T extends Consultation> extends ControllerList<T> { 
    // Consulation héritant de Controller
     
    //qq méthodes bateau de calcul etc...
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    class Patient extends Controller { //(donc c'est un MyController)
       public Patient() {
          super.addChildrenList("consultations", new Consultations());
          super.addChildren("coordinate", new Coordinate());
       }
     
       public Consultations getConsultations() {
          return (Consultations) super.getChildrenList("consultations");
       }
    }

    et la j'ai plein de warning au niveau de l'ajout de mes consultations dans Patient, mais aussi au niveau de la liste de consulation dans Consultations...il considère ca comme un objet.

    moi en gros...je veux faire un truc super générique a la base, en l'occurence ma classe Controller, et au premier plan, faire qq chose de commun, mais reprenant tout le tps le meme traitement. Donc, oui mes signatures sont différentes, mais pour le traitement que fait Controller, tous mes objets héritant peuvent au finale redevenir des Controller classiques...mais la..je bloque un peu
    Hum hum hum...géant vert ! ! !
    Le meilleur moyen de trouver c encore de chercher ! ! !

  10. #10
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Points : 5 943
    Points
    5 943
    Par défaut
    Premier point, tu dois spécifier le type de tes classes utilisant les générics.
    Par exempleau lieu de :
    Citation Envoyé par Piolet
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private Hashtable<String, ControllerList> _childrenList;
    il faut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private Hashtable<String, ControllerList<Controller>> _childrenList;
    Ceci est valable pour toutes les classes utilisant les générics.

    Ensuite pour la méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public Consultations<Consultation> getConsultations() {
        return (Consultations<Consultation>) super.getChildrenList("consultations");
    }
    Tu auras toujours un warning car tu cast un ControllerList<Controller> en Consultations<Consultation>.
    Ce "problème" a déjà été abordé plusieur fois sur le forum. Voir également dans la FAQ :
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  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
    Citation Envoyé par le y@m's Voir le message
    Ce "problème" a déjà été abordé plusieur fois sur le forum. Voir également dans la FAQ :
    oui voila c'est ce warning la que j'avais...je vais regarder ca de plus pret je te remercie

    et cette fois je cloture pour de bon
    Hum hum hum...géant vert ! ! !
    Le meilleur moyen de trouver c encore de chercher ! ! !

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

Discussions similaires

  1. C++ héritage et vector iterator
    Par Wilgard dans le forum C++
    Réponses: 4
    Dernier message: 23/10/2012, 15h42
  2. Héritage, dynamic_cast et vector
    Par kassidy dans le forum Langage
    Réponses: 2
    Dernier message: 09/06/2010, 14h09
  3. héritage et stl::vector
    Par chollier dans le forum Débuter
    Réponses: 8
    Dernier message: 26/05/2010, 20h08
  4. Problème avec l'héritage et les vector
    Par Jayse dans le forum C++
    Réponses: 5
    Dernier message: 29/09/2008, 10h52
  5. Héritage entre Forms
    Par BarBal dans le forum Composants VCL
    Réponses: 7
    Dernier message: 29/08/2002, 17h44

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